proxy_cache_bypass配合$http_x_no_cache实现请求头触发的强制回源,proxy_no_cache确保响应不写入缓存,二者协同达成“本次实时、不污染缓存”的效果;需在启用proxy_cache的前提下配置,验证时检查$upstream_cache_status为BYP。

用 proxy_cache_bypass 配合自定义请求头(如 X-No-Cache 或 X-Refresh),是生产环境中最干净、最可控的“一键绕过缓存”方式。它不污染 URL,不依赖客户端改参数,适合运维手动触发、灰度验证或自动化巡检场景。
核心配置:靠请求头触发绕过逻辑
在 http 块或具体 location 中添加以下两行:
-
proxy_cache_bypass $http_x_no_cache;—— 请求头存在且值非空(如X-No-Cache: 1、X-No-Cache: true、甚至X-No-Cache: anything)时,本次请求直接回源,不查缓存 -
proxy_no_cache $http_x_no_cache;—— 同样条件成立时,禁止将本次响应写入缓存(哪怕后端返回了Cache-Control: public, max-age=3600也无效)
⚠️ 注意:$http_x_no_cache 是 Nginx 自动映射的变量名,对应请求头 X-No-Cache(短横转下划线 + 全小写)。其他类似如 X-Refresh → $http_x_refresh,X-Debug → $http_x_debug。
为什么必须同时配 proxy_no_cache?
只设 proxy_cache_bypass 能跳过读缓存,但若后端响应带了强缓存头(如 Cache-Control: public, max-age=3600),Nginx 仍可能把这次新响应存进缓存——下次普通请求就又拿到“刚绕过但被缓存”的结果,失去调试意义。
- 加
proxy_no_cache后,满足条件的请求:既不读缓存,也不写缓存 - 这样真正实现“本次强制实时、且不污染缓存池”的效果
生产可用的完整 location 示例
适用于 API 接口或关键动态页面:
location /api/ {
proxy_pass http://backend;
proxy_cache my_cache;
<pre class="brush:php;toolbar:false;"># ✅ 一键绕过:带 X-No-Cache 头即生效
proxy_cache_bypass $http_x_no_cache;
proxy_no_cache $http_x_no_cache;
# ✅ 可选增强:也支持 ?refresh=1 参数作为备用入口(兼容旧脚本)
proxy_cache_bypass $http_x_no_cache $arg_refresh;
proxy_no_cache $http_x_no_cache $arg_refresh;
proxy_cache_valid 200 302 10m;
proxy_cache_key "$host$request_uri";
}
如何验证是否生效?
发送带头请求,观察响应头和日志:
- 执行:
curl -H "X-No-Cache: 1" -I https://your-domain.com/api/data - 预期响应头中不含
X-Cache: HIT,常见为X-Cache: MISS或无该头 - 检查 Nginx access log 中的
$upstream_cache_status字段,应为BYP(bypass) - 后端 access log 应有对应请求记录,确认已真实打到上游
不复杂但容易忽略:确保该 location 已启用 proxy_cache,且缓存区(如 my_cache)已在 http 块正确定义。











