proxy_no_cache仅控制响应是否写入缓存,不影响缓存查找;真正实现动态绕过缓存需配合proxy_cache_bypass,如proxy_cache_bypass $arg_nocache; proxy_no_cache $arg_nocache。

Nginx 的 proxy_no_cache 指令本身不支持直接根据变量动态绕过缓存,但它可以配合变量(如 $arg_nocache、$http_x_no_cache 等)实现“条件性不缓存”效果——本质是通过变量控制是否将响应标记为不可缓存,从而影响后续的缓存决策链(尤其是与 proxy_cache_bypass 和 proxy_cache 配合使用时)。
proxy_no_cache 的真实作用是“标记响应不进缓存”,不是“跳过缓存检查”
proxy_no_cache 用于在 代理响应返回给客户端前,决定是否将该响应体写入缓存区。它只影响缓存写入(cache store),不影响缓存查找(cache lookup)。也就是说:
- 即使设置了
proxy_no_cache 1,Nginx 仍会先查缓存(如果命中且未过期,就直接返回缓存内容); - 只有当 Nginx 决定向上游请求新响应时,
proxy_no_cache才起作用:若其值为非空/非 0,该新响应就不会被保存进缓存。
所以单靠 proxy_no_cache 无法实现“动态跳过缓存读取”。真正控制“是否走缓存路径”的是 proxy_cache_bypass。
用 $arg_nocache 实现“带参即绕过缓存”的典型配置
常见需求:URL 带 ?nocache=1 或 &_t=123456789 时,强制回源,不读缓存也不存缓存。
推荐组合写法:
proxy_cache_bypass $arg_nocache $arg_t; proxy_no_cache $arg_nocache $arg_t;
说明:
-
proxy_cache_bypass:只要任一变量非空(如$arg_nocache="1"),Nginx 就跳过缓存查找,直接转发请求到上游; -
proxy_no_cache:确保即使因其他原因(如缓存失效重验)触发了新响应,该响应也不会被缓存下来。
✅ 这样就实现了“有参即绕过缓存读+写”的完整逻辑。
用自定义请求头(如 X-No-Cache)实现灰度或调试绕过
适合后端或测试人员通过 header 控制,不暴露在 URL 中:
proxy_cache_bypass $http_x_no_cache; proxy_no_cache $http_x_no_cache;
此时发起请求时带上:
curl -H "X-No-Cache: 1" https://example.com/api
Nginx 会识别 $http_x_no_cache 为非空字符串,触发绕过逻辑。注意:$http_* 变量名自动将 header 名转为小写并用下划线替代短横(如 X-Real-IP → $http_x_real_ip)。
常见陷阱与注意事项
以下行为容易导致绕过失效,需特别留意:
-
proxy_cache_bypass和proxy_no_cache的变量值必须为“非空字符串”或“非 0 数字”才生效;空字符串、"0"、"off"都视为 false; - 变量必须在
location或更内层作用域中可访问(如$arg_*在server块中可用,但某些自定义变量需用set显式声明); - 如果同时配置了
proxy_cache_valid和add_header X-Cache $upstream_cache_status,可通过响应头验证是否真正绕过(HIT/MISS/BYPASS); -
proxy_cache_bypass不会改变Cache-Control响应头,如需透传或覆盖,需额外用proxy_hide_header/add_header处理。
不复杂但容易忽略。










