proxy_cache_bypass用于控制哪些请求不走缓存而直连后端,其值为非空且非"0"的变量将触发绕过;支持请求头(如$http_x_force_refresh)、参数($arg_nocache)、Cookie等多条件组合,并需配合proxy_cache_key合理设计以避免缓存污染。

在 macOS 下使用 Nginx 做反向代理时,proxy_cache_bypass 用于控制哪些请求**不走缓存**、直接转发给后端。它本身不“限制”请求头,而是根据指定的变量(如请求头、cookie、参数等)是否满足条件,决定是否跳过缓存。
proxy_cache_bypass 的作用逻辑
它是一个布尔型指令:只要列表中任意一个变量值为非空字符串(且不等于 "0"),Nginx 就不使用缓存,直接向后端发起新请求。
常见用法示例:
proxy_cache_bypass $http_pragma $http_authorization $arg_nocache;
-
$http_pragma:匹配请求头Pragma: no-cache -
$http_authorization:只要有认证头(如 Bearer Token),就绕过缓存(适合登录态接口) -
$arg_nocache:URL 中含?nocache=1或任意非空值即绕过
如何让特定请求头触发 bypass
若你想用自定义请求头(比如 X-Force-Refresh: 1)来强制跳过缓存,只需将对应变量加入指令:
proxy_cache_bypass $http_x_force_refresh;
注意:$http_x_force_refresh 是 Nginx 自动将请求头 X-Force-Refresh 转换的变量名(小写 + 下划线)。只要该头存在且值非空、非 "0",缓存就会被跳过。
你也可以组合多个条件:
proxy_cache_bypass $http_x_force_refresh $arg_v $cookie_dev_mode;
-
$arg_v:匹配?v=xxx这类版本参数 -
$cookie_dev_mode:当客户端携带dev_mode=1Cookie 时也绕过
配合 proxy_cache_key 确保缓存隔离
仅靠 proxy_cache_bypass 不足以防止缓存污染。如果你希望带认证头的请求不缓存,同时又想缓存无认证的公开内容,还需在 proxy_cache_key 中排除敏感字段:
proxy_cache_key "$scheme$request_method$host$request_uri";
不要把 $http_authorization 或 $cookie_session 写进 key —— 否则每个用户请求都生成独立缓存,失去意义。真正需要区分缓存的场景(如多租户子域名),才应把 $host 或 $http_x_tenant_id 加入 key。
调试技巧:验证 bypass 是否生效
在 location 块中添加响应头,方便观察缓存行为:
add_header X-Cache-Status $upstream_cache_status;
-
HIT:命中缓存 -
MISS:未命中,但会缓存响应 -
BYPASS:因proxy_cache_bypass触发,既不读也不存缓存
用 curl 测试:
curl -H "X-Force-Refresh: 1" http://localhost/api/data # 应返回 BYPASS<br>curl http://localhost/api/data # 可能返回 HIT 或 MISS
不复杂但容易忽略:bypass 是“跳过缓存”,不是“清除缓存”。要清旧缓存需用 proxy_cache_purge(需启用 ngx_http_proxy_cache_purge 模块)或手动删缓存目录。











