proxy_no_cache管“写”、proxy_cache_bypass管“读”,必须共用同一变量并在启用proxy_cache的location中成对配置,任一变量非空且不为"0"/"off"即触发,双生效时$upstream_cache_status显示BYP。

排查 proxy_no_cache 和 proxy_cache_bypass 的区别,关键不是看文档定义,而是看它们在真实请求中各自影响哪一环——一个管“写”,一个管“读”。配置错位或只配其一,现象可能一样(比如缓存没绕过),但原因完全不同。
作用阶段不同:一个决定是否读缓存,一个决定是否存响应
• proxy_cache_bypass 只影响请求发起时的“缓存查找”环节:值为真时,Nginx 直接把请求转发给后端,跳过检查本地有没有缓存副本。但它不阻止后端返回的内容被缓存下来。
• proxy_no_cache 只影响响应返回后的“缓存写入”环节:值为真时,Nginx 丢弃本次响应,不把它存进缓存区。但它不干预当前请求是否从缓存里取数据——如果缓存里已有旧内容,仍可能直接返回 HIT。
两者必须同时启用、共用同一变量,才能实现“彻底绕过”:既不读旧缓存,也不存新响应。
变量生效条件看似相似,实则细节关键
两个指令都接受变量列表,任一变量值满足以下条件即触发:
- 非空字符串(如
"1"、"true"、"force") - 不是
"0"(不区分大小写) - 不是
"off"(不区分大小写)
但要注意:$arg_debug 在 URL 中是 ?debug=(空值)还是 ?debug=1,结果完全不同;$http_x_bypass 收到 X-Bypass: 0 会被视为 false,而 X-Bypass: false 却是 true(因非空且不等于 "0"/"off")。
配置位置错误会让指令完全失效
这两个指令都不能脱离 proxy_cache 存在:
- 若
proxy_cache mycache写在某个location /api/块里,那proxy_cache_bypass和proxy_no_cache也必须出现在同一块内——写在server或http块顶层无效 - 若用了
if或嵌套location,变量作用域可能被覆盖,导致指令实际未加载 -
proxy_no_cache必须写在proxy_cache之后(同级 location 内),顺序颠倒会被 Nginx 忽略
验证方法:运行 nginx -T 查看完整展开配置,确认两条指令是否出现在同一个 location 块、且都在 proxy_cache 启用之后。
怎么确认它们到底起没起作用
光看配置没用,得看实际响应和日志:
- 加响应头:
add_header X-Cache-Status $upstream_cache_status;,请求命中时看到X-Cache-Status: BYP才代表双指令共同生效 - 查 access log:
$upstream_cache_status字段为BYP表示绕过成功;若是HIT或MISS,说明至少有一个指令没触发 - 特别注意:仅
proxy_cache_bypass生效时,$upstream_cache_status是BYP,但后端返回的响应仍可能被缓存;只有双指令都生效,才能避免缓存污染











