nginx需同时配置proxy_cache_bypass和proxy_no_cache指令,均使用$http_x_no_cache变量实现缓存双绕过:非空值(如"1")时跳过查找且不写入缓存,二者缺一不可。

要让 Nginx 在收到客户端带 X-No-Cache 请求头时自动绕过缓存(既不读缓存,也不写缓存),关键不是加个 header 就行,而是用变量驱动两个指令协同工作:一个跳过缓存查找,一个阻止响应存入缓存。
配置核心:用 $http_x_no_cache 触发双绕过
客户端发送请求时带上 X-No-Cache: 1(或 true、yes 等非空值),Nginx 会自动将其映射为变量 $http_x_no_cache(注意:短横变下划线、全小写)。这个变量可直接用于判断:
-
proxy_cache_bypass $http_x_no_cache:只要该变量非空(比如值是
"1"),本次请求就跳过缓存查找,直连后端 - proxy_no_cache $http_x_no_cache:同样条件下,本次响应也不会写入缓存,避免敏感内容污染缓存池
⚠️ 两个指令必须写在同一个已启用缓存的 location 块中,且缺一不可。只配一个,逻辑就不完整。
完整配置示例(推荐直接复用)
在你的 location 块里加入以下几行(确保前面已配置 proxy_cache 和 proxy_cache_valid):
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_bypass $http_x_no_cache;
proxy_no_cache $http_x_no_cache;
}
无需额外 map,因为 $http_x_no_cache 是 Nginx 内置变量,天然支持“非空即绕过”逻辑。值为 ""、"0" 或 "off" 时不会触发;其余如 "1"、"true"、"yes" 均有效。
验证是否生效
用 curl 发起带头请求:
curl -H "X-No-Cache: 1" -I https://example.com/api/data
观察响应头:
- 若看到
X-Cache-Status: BYP(不是HIT或MISS),说明成功绕过缓存查找 - 若后续相同 URL 不带头请求返回新内容(而非旧缓存),说明
proxy_no_cache也起效了 - 日志中
$upstream_cache_status字段应为BYP
进阶建议:配合 map 更灵活控制
如果需要支持大小写不敏感、模糊匹配(如 X-No-Cache: YES),或与其他条件组合(如同时检查 Cookie 或参数),建议用 map 统一处理:
map $http_x_no_cache $skip_cache {
~*^(1|true|yes|on)$ 1;
default 0;
}
然后在 location 中使用:
proxy_cache_bypass $skip_cache; proxy_no_cache $skip_cache;
这样更可控,也便于后续扩展多维度判断逻辑。











