必须忽略 Cache-Control 才能强制缓存,因为 Nginx 默认严格遵循后端返回的 no-cache、private、max-age=0 等头导致无法缓存;proxy_ignore_headers Cache-Control 可使其失效,再通过 proxy_cache_valid 显式设定缓存时间实现强制缓存。

直接用 proxy_ignore_headers Cache-Control 屏蔽后端返回的缓存指令,再配合 proxy_cache_valid 显式设定时间,Nginx 就能绕过 no-cache、private、max-age=0 等不合理设置,对静态资源实现强制缓存。
为什么必须忽略 Cache-Control 才能强制缓存
后端应用(尤其是框架默认行为)常对 JS、CSS、图片等静态资源返回 Cache-Control: no-cache 或 max-age=0,哪怕内容本身完全不变。Nginx 默认严格遵循这些头,导致无法缓存——即使你已配置好 proxy_cache,也会被直接跳过。
-
no-cache:要求每次回源验证,实际常被误用为“禁止缓存” -
private或no-store:本意是防敏感数据泄露,但若响应体不含用户信息(如 token、手机号),就是过度保护 -
max-age=0:等效于不缓存,而你知道该资源未来 1 小时内绝不会更新
核心配置写法(必须按顺序)
在启用缓存的 location 块中,把以下三行写在 proxy_pass 之前:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
proxy_ignore_headers Cache-Control;—— 让 Nginx 在缓存决策时彻底无视后端的Cache-Control -
proxy_cache_valid 200 302 1h;—— 明确告诉 Nginx:对成功响应统一缓存 1 小时 -
proxy_cache_valid 404 1m;—— 可选,为错误页设短缓存,减轻回源压力
注意:proxy_ignore_headers 不删除响应头,只让它失效;客户端仍可能看到原始 Cache-Control: no-cache,但 Nginx 已按你写的 1h 执行缓存。
配套安全与防护要点
忽略 Cache-Control 后,private 和 no-store 失效,意味着原本不该进共享缓存的内容,现在可能被写入磁盘。必须确认安全边界:
- 检查响应体:确保没有手机号、token、用户昵称、CSRF token 等动态或敏感字段
- 若后端还返回了
Set-Cookie(如埋点 ID),需额外加proxy_ignore_headers Set-Cookie;并配proxy_hide_header Set-Cookie;防止透传 - 避免与
proxy_no_cache冲突:如果该 location 下有带用户参数的请求(如?uid=123),要确保它们没意外触发跳过缓存
怎么验证真生效了
光看配置没用,得观察运行时行为:
- 用
curl -I请求两次相同 URL,观察X-Cache-Status:首次为MISS,第二次为HIT,说明缓存已命中 - 检查响应头是否仍含
Cache-Control: no-cache(说明proxy_ignore_headers起作用,而非误删) - 查看缓存目录下对应 key 的文件更新时间,或用
nginx -t && systemctl reload nginx后观察缓存行为变化

















