nginx 在 dev_mode=1 时成功绕过缓存需满足:x-cache-status: byp、无 hit/miss、不写入缓存且响应无 set-cookie;无 cookie 时应出现 miss→hit;日志中 upstream_cache_status 显示 byp 可佐证。

要验证 Nginx 在特定 Cookie(如 dev_mode=1 或 admin=1)下是否真正绕过缓存,不能只看配置有没有写对,关键得用可观察的方式确认请求确实没读缓存、也没写缓存。
准备基础配置
确保已在对应 location 块中同时启用两个指令,并使用同一变量:
-
proxy_cache_bypass $cookie_dev_mode;—— 请求带Cookie: dev_mode=1时跳过缓存读取 -
proxy_no_cache $cookie_dev_mode;—— 同样条件下,后端响应也不写入缓存 - 加上
add_header X-Cache-Status $upstream_cache_status;,用于响应头中直观看到缓存状态
用 curl 发起带 Cookie 的请求
在终端执行以下命令,模拟开发人员带调试 Cookie 访问:
curl -H "Cookie: dev_mode=1" -I https://your-site.com/api/data
观察返回头中:
-
X-Cache-Status: BYP→ 表示已成功绕过缓存(BYP是BYPASS的缩写) - 没有
X-Cache: HIT或X-Cache: MISS→ 说明未进入缓存流程 - 响应中不应出现
Set-Cookie(若后端本应返回)→ 需确认是否加了proxy_hide_header Set-Cookie
对比无 Cookie 的请求行为
再发一次不带该 Cookie 的请求:
curl -I https://your-site.com/api/data
此时应看到:
- 首次:
X-Cache-Status: MISS(缓存未命中,但已写入) - 第二次:
X-Cache-Status: HIT(命中缓存,说明绕过机制只对dev_mode=1生效)
检查日志辅助验证
开启缓存日志能进一步确认行为是否符合预期:
- 在
http块中定义日志格式:log_format cache '$remote_addr - $upstream_cache_status "$request" $upstream_http_x_cache'; - 在
location中启用:access_log /var/log/nginx/cache.log cache; - 查看日志中对应请求行,确认
$upstream_cache_status字段是否为BYP











