nginx 中需在启用缓存的 location 块内配对使用 proxy_cache_bypass 与 proxy_no_cache,并用变量(如 $arg_nocache)控制绕过条件,同时添加 x-cache-status 响应头验证是否真正生效。

要在 Nginx 中让特定请求绕过缓存、直连后端源站,核心是正确配置 proxy_cache_bypass(反向代理场景)或 fastcgi_cache_bypass(PHP-FPM 场景),但仅写这一条指令是无效的——它必须和缓存启用指令成对出现,且需配合防止响应被缓存的设置。
必须在同一 location 块中启用缓存
单独在 server 或 http 块里写 proxy_cache_bypass 不起作用。Nginx 只在已开启缓存的 location 里识别该指令:
- 确保有
proxy_cache mycache;,其中mycache必须与proxy_cache_path中定义的keys_zone名称完全一致 - 必须定义可缓存的响应,例如:
proxy_cache_valid 200 302 5m; - 错误示例:只在 location 外配置 bypass,但 location 内没写
proxy_cache→ 配置被忽略
用变量精准控制绕过条件
指令接收一个或多个变量,任一变量值为非空字符串、且不等于 "0" 或 "off"(不区分大小写)时即触发绕过。常用变量包括:
-
$http_x_bypass_cache:前端加请求头X-Bypass-Cache: 1即可 -
$arg_nocache:访问时带上?nocache=1参数 -
$cookie_dev_mode:登录态中设置dev_mode=1的 Cookie -
$remote_addr ~ ^(192\.168\.|10\.):结合set和if限制内网 IP 才能绕过
注意变量命名规则:Header X-Refresh-Cache 对应 $http_x_refresh_cache(全小写、短横变下划线、固定前缀)。
务必同步配置 proxy_no_cache 防止污染
proxy_cache_bypass 只跳过“读缓存”,默认仍会把后端响应写入缓存(只要状态码匹配 proxy_cache_valid)。若带用户 Token 的请求被缓存,后续普通用户可能误命中脏数据:
- 必须配对使用:
proxy_no_cache $http_x_bypass_cache; - 两个指令共用同一变量,确保既不读旧缓存,也不存新响应
- 多个条件可空格分隔:
proxy_cache_bypass $arg_nocache $http_authorization;,proxy_no_cache $arg_nocache $http_authorization;
验证是否真正生效
光看配置不能确认效果,要通过响应头或日志观察实际行为:
- 添加响应头:
add_header X-Cache-Status $upstream_cache_status;,绕过成功时值为BYPASS - 开启缓存日志:
log_format cache '$remote_addr - $upstream_cache_status "$request"';,查 access log 确认状态 - 响应中不应出现
X-Cache: HIT类标识;若看到X-Cache: MISS,说明只是未命中缓存,但并未 bypass











