Nginx动态跳过缓存需在启用proxy_cache的location中配置proxy_cache_bypass,变量名须小写且短横转下划线(如$http_x_refresh),值非空且不为"0"/"off"即生效,多条件用空格分隔,务必通过响应头X-Cache和日志$upstream_cache_status验证。

要让 Nginx 对特定请求动态跳过缓存,关键不是“删缓存”,而是让这些请求在进入缓存查找环节前就被拦截并直连后端。核心靠 proxy_cache_bypass 指令配合变量判断,但必须满足前提、写对变量、值符合逻辑,否则配置等于没写。
必须共存:proxy_cache 和 proxy_cache_bypass 要在同一 location 里
只写 proxy_cache_bypass $http_x_refresh 没用。Nginx 完全忽略它,除非同一 location 中明确启用了缓存:
- 必须有
proxy_cache mycache(名称需与proxy_cache_path中定义的keys_zone一致) - 不能只在
http或server块里全局写proxy_cache_bypass,它不会继承到未启用缓存的 location - 常见错误:把
proxy_cache_bypass放在server块,却漏了location里的proxy_cache
变量要写对:HTTP 头 → $http_ 开头 + 短横转下划线
客户端带 X-Refresh: 1,Nginx 内部对应变量是 $http_x_refresh,不是 $http_X_Refresh 或 $http_xrefresh:
- 大小写敏感:必须全小写
- 短横(-)一律转为下划线(_)
- 值只要非空、且不等于
"0"或"off"(不区分大小写),就触发 bypass - 例如这些都有效:
X-Refresh: true、X-Refresh: T、X-Refresh: 123
支持多条件组合:任意一个为真即绕过
可以同时传入多个变量,实现精细控制:
proxy_cache_bypass $http_x_preview $arg_debug $remote_addr;- 仅允许内网管理员预览:
proxy_cache_bypass $http_x_preview $remote_addr ~^(192\.168\.10\.); - 结合
map统一计算:proxy_cache_bypass $skip_cache;,再用 map 规则生成布尔值
验证是否真正生效:看响应头和日志
上线后务必检查实际行为,不能只看配置:
- 发起带头请求:
curl -H "X-Refresh: 1" https://yoursite.com/api/data - 响应头中不应出现
X-Cache: HIT;理想是X-Cache: MISS或无此头 - 日志中
$upstream_cache_status应显示BYP(bypass)或MISS,而非HIT - 若仍命中缓存,先确认 location 是否真走了你写的那段配置(可用打印调试变量)











