要让Nginx强制缓存动态内容,需用proxy_ignore_headers拦截后端的Cache-Control、Expires、Set-Cookie、Vary等禁缓存响应头,再由proxy_cache_valid等指令接管缓存决策;必须满足proxy_cache_path已定义、location内启用proxy_cache、proxy_ignore_headers置于proxy_pass之前且大小写正确三个条件。

要让 Nginx 强制缓存动态内容,核心不是修改后端,而是用 proxy_ignore_headers 把后端那些“不准缓存”的指令拦下来,再由 Nginx 自己按你定的规则缓存。
关键不在“忽略”本身,而在“接管决策权”:后端返回 Cache-Control: no-cache 或 Set-Cookie,Nginx 默认就放弃缓存;proxy_ignore_headers 的作用,就是让它对这些头“视而不见”,转而完全信任你写的 proxy_cache_valid 和缓存配置。
必须满足的三个基础条件
proxy_cache_path已在http块中定义
例如:<font color="#2c3e50">proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=dynamic_cache:50m inactive=10m max_size=2g use_temp_path=off;</font>当前
location块内启用了缓存
必须包含:<font color="#2c3e50">proxy_cache dynamic_cache;</font><font color="#2c3e50">proxy_cache_valid 200 302 5m;</font>(至少为常见成功状态码指定时间)proxy_ignore_headers必须写在proxy_pass之前,且只在该location内生效
错误写法:放在server块顶层、或写在proxy_pass后面、或大小写错误(如cache-control)
针对动态内容,该忽略哪些头?
动态接口常误带以下响应头,直接导致 Nginx 跳过缓存:
-
Cache-Control:尤其含no-cache、private、max-age=0时,必须忽略 -
Expires:后端设的过期时间若已过去(如Expires: 1970-01-01),Nginx 默认不缓;忽略后它才认你的proxy_cache_valid -
Set-Cookie:Nginx 默认拒绝缓存任何带此头的响应——哪怕只是匿名统计 Cookie。确认响应体不含 session ID、token、用户标识后,才可忽略 -
Vary:若接口返回内容与User-Agent、Accept-Encoding等无关(如纯 JSON 公共配置),忽略可避免 cache key 分裂,提升命中率
示例写法:<font color="#2c3e50">proxy_ignore_headers Cache-Control Expires Set-Cookie Vary;</font>
安全与可用性不能跳过的检查点
- 忽略
Set-Cookie后,务必加proxy_hide_header Set-Cookie;,否则客户端可能收到无效或冲突 Cookie - 忽略
Cache-Control后,private和no-store失效——如果响应体实际含手机号、token、用户昵称等字段,会被写入共享缓存区,造成泄露 - 动态内容缓存前,确认它确实无用户上下文(比如
/api/v1/config/public可缓,/api/v1/user/profile绝对不可) - 建议为该
location单独加调试头:<font color="#2c3e50">add_header X-Cache-Status $upstream_cache_status;</font>
用curl -I请求两次,看是否从MISS变成HIT
一个典型配置示例
location ^~ /api/v1/feature-flags {
proxy_pass https://backend;
proxy_cache dynamic_cache;
proxy_cache_valid 200 302 10m;
proxy_ignore_headers Cache-Control Expires Set-Cookie Vary;
proxy_hide_header Set-Cookie;
add_header X-Cache-Status $upstream_cache_status;
}路径用 ^~ 前缀确保优先匹配,专用于无状态、低频更新的动态接口,不波及其他路由。
不复杂但容易忽略。


















