登录态页面缓存隔离需同时满足“不查缓存、不写缓存、键不混用”:通过map统一提取登录标识并设default为0,location中成对启用proxy_cache_bypass和proxy_no_cache,且cache_key必须包含登录标识。

用户登录状态下的页面缓存隔离不能靠单一指令实现,必须让请求“不查缓存、不写缓存、键不混用”三者同时生效。否则已登录用户的敏感内容可能被游客命中,或不同用户间响应相互覆盖。
用 map 统一提取登录标识并设默认安全值
登录态通常藏在 Cookie(如 session_id、auth_token)或 Header(如 Authorization)中。需统一映射为 0/1 控制变量,且 default 必须为 0,防止空值误触发隔离:
-
map $cookie_session_id $no_cache_login { ~. 1; default 0; }—— 只要 session_id 非空即启用隔离 -
map $http_authorization $no_cache_auth { ~^Bearer 1; default 0; }—— 匹配 Bearer Token 类请求 -
map "$cookie_session_id:$http_authorization" $no_cache_combined { "" 0; default 1; }—— 多源任一存在即启用,更鲁棒
location 中成对启用 proxy_cache_bypass 和 proxy_no_cache
这两个指令必须同时出现、传入相同变量,Nginx 才会执行“读写双拦截”:
-
proxy_cache_bypass $no_cache_combined;→ 请求阶段跳过缓存查找,强制回源 -
proxy_no_cache $no_cache_combined;→ 响应阶段禁止写入缓存,防止敏感内容落盘
只要变量值为 1(例如用户已登录),该请求就完全脱离缓存链路,不参与任何缓存生命周期管理。
显式构造含登录标识的 cache_key
即使禁用了缓存写入,若 cache_key 未区分登录态,未登录用户仍可能意外命中已登录用户的旧响应(因 key 冲突导致缓存污染)。必须将登录标识固化进 key:
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args$cookie_session_id";- 对无 session 的请求,
$cookie_session_id为空字符串,自动形成独立 key,不影响匿名缓存复用 - 若使用 JWT,建议提取其中 user_id 字段(需配合 Lua 或 auth_request 模块),比直接用完整 token 更安全可控
静态资源与未登录流量需明确排除干预
个性化缓存策略应默认关闭,只对明确标记的请求生效:
- 所有 map 的 default 值严格设为 0,避免空 cookie、缺失 header 等边界情况导致误判绕过
- 静态资源(如 /static/、.js/.css/.png)应放在独立
location块中,并跳过上述逻辑,避免额外开销 - 游客访问的通用页面(如首页 HTML)可启用较长时间缓存:
proxy_cache_valid 200 10m;











