proxy_cache_bypass和proxy_no_cache可结合Header动态控制缓存:前者使请求绕过缓存直连后端,后者禁止缓存响应;二者常配合使用,如proxy_cache_bypass $http_x_refresh; proxy_no_cache $http_x_refresh;。

可以通过 Nginx 的 proxy_cache_bypass 和 proxy_no_cache 指令,结合请求头(Header)的值动态控制缓存行为,实现“根据 Header 变化更新或跳过缓存”的效果。核心不是“更新已有缓存”,而是让带特定 Header 的请求绕过缓存,直接回源;同时可配合缓存键(proxy_cache_key)把 Header 值纳入缓存标识,使不同 Header 值对应不同缓存副本。
用 Header 控制是否跳过缓存
当客户端携带特定 Header(如 X-Refresh: 1 或 Cache-Control: no-cache)时,让请求不读缓存、直接转发给后端:
- 使用
proxy_cache_bypass:满足条件时,Nginx 不查找缓存,直接代理请求(但仍可能缓存响应) - 使用
proxy_no_cache:满足条件时,不仅不读缓存,还禁止将响应写入缓存
示例配置:
proxy_cache_bypass $http_x_refresh; # X-Refresh 非空即绕过缓存<br>proxy_no_cache $http_x_refresh; # 同时禁止缓存该响应
把 Header 值加入缓存键,实现“多版本缓存”
若希望 User-Agent、Accept-Language 或自定义 Header(如 X-Region: cn)影响缓存内容,需将其纳入 proxy_cache_key:
- 默认缓存键通常只含 scheme + host + uri,相同 URL 总是命中同一缓存
- 添加 Header 后,
X-Region: cn和X-Region: us就会分别缓存不同响应
示例:
proxy_cache_key "$scheme$request_method$host$request_uri$http_x_region";
⚠️ 注意:增加维度会降低缓存命中率,需权衡业务需求与缓存效率。
配合后端响应头实现智能缓存策略
Nginx 支持根据后端返回的响应 Header(如 Cache-Control、Vary)自动调整缓存行为:
-
proxy_ignore_headers Cache-Control;可忽略后端指令,强制按 Nginx 规则缓存 -
proxy_cache_valid 200 302 10m;设置状态码对应的默认缓存时间 - 若后端返回
Vary: X-Region,Nginx 会自动将该 Header 值纳入缓存键(需开启proxy_cache_vary on;)
验证与调试技巧
快速确认 Header 是否生效、缓存是否命中:
- 在响应头中添加
X-Cache-Status:用add_header X-Cache-Status $upstream_cache_status; - 查看日志:在
log_format中加入$upstream_cache_status和$http_x_region等变量 - 用 curl 测试:
curl -H "X-Region: cn" http://example.com/api对比不同值的响应头和缓存状态


















