验证登录态页面绕过缓存需从请求行为、响应头、缓存文件和日志四维度交叉确认:登录请求应返回X-Cache-Status: BYPASS且无X-Cache: HIT/STALE,proxy_cache_bypass与proxy_no_cache须成对生效并传入相同变量,缓存目录中不应生成对应文件,cache_key必须包含cookie_session_id以避免key冲突,日志中$no_cache_combined应分别为1和0。

要验证登录态下页面是否真正绕过缓存,不能只看配置是否写对,而要从请求行为、响应头、缓存文件和日志四个维度交叉确认。核心是模拟已登录用户发起请求,观察 Nginx 是否全程跳过缓存链路——既不读旧缓存,也不写新缓存,且 key 不混用。
检查响应头是否携带缓存绕过信号
登录后访问目标页面(如 /dashboard),用 curl 或浏览器开发者工具查看响应头:
- 响应中应出现
X-Cache-Status: BYPASS(前提是启用了add_header X-Cache-Status $upstream_http_x_cache_status;或类似调试头) - 不应出现
X-Cache: HIT或X-Cache: STALE - 若配置了强制禁用浏览器缓存,还应看到:
Cache-Control: no-store, no-cache, must-revalidate, max-age=0Pragma: no-cacheExpires: 0
验证 proxy_cache_bypass 和 proxy_no_cache 是否成对生效
这两个指令必须同时启用、传入相同变量,否则会出现“能读旧缓存但不存新内容”或“存了敏感内容却没跳过读取”的漏洞:
- 在 location 块中确认存在形如:
proxy_cache_bypass $no_cache_combined;proxy_no_cache $no_cache_combined; - 用 curl 模拟登录态请求:
curl -H "Cookie: session_id=abc123" https://example.com/dashboard
此时$no_cache_combined应为 1,Nginx 就不会查缓存、也不会写缓存 - 再发一个无 Cookie 的请求:
curl https://example.com/dashboard
此时变量为 0,应走正常缓存流程(返回 HIT 或 MISS)
观察缓存目录是否有对应文件生成
登录态请求不应在缓存路径中留下任何文件:
- 查清你定义的缓存路径,例如:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:100m; - 登录后访问一次页面,然后执行:
find /var/cache/nginx -type f | grep -i dashboard - 若结果为空,说明
proxy_no_cache生效;若存在文件,说明变量未正确触发或指令未生效 - 注意:即使禁用写入,若
cache_key未含登录标识,游客仍可能命中已登录用户的旧缓存文件(key 冲突)。所以还要比对 key 构造逻辑,例如:proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args$cookie_session_id";
确保带 session_id 的 key 与不带的 key 完全不同
用日志辅助定位问题
在 http 或 location 块中临时添加日志记录,确认变量值是否符合预期:
- 加一条日志格式:
log_format cache_debug '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$cookie_session_id" "$no_cache_combined" "$upstream_http_x_cache_status"'; - 在 server 中引用:
access_log /var/log/nginx/cache_debug.log cache_debug; - 发起登录/未登录请求后,检查日志中
$no_cache_combined列是否分别为 1 和 0











