必须在启用缓存的location块中、proxy_pass之前配置proxy_ignore_headers cache-control expires set-cookie vary(大小写敏感、空格分隔),再配proxy_cache_valid等规则,才能让nginx忽略上游干扰头并按自定义策略缓存。

直接在启用缓存的 location 块中写 proxy_ignore_headers,指定要忽略的头名(大小写敏感、空格分隔),并确保它紧挨着 proxy_pass 且位于其之前——这不是删除头,而是让 Nginx 在做缓存决策时彻底不读它们。
必须忽略的四个关键头
后端返回的这四个响应头会直接干扰 Nginx 缓存行为,需成组或按需忽略:
-
Cache-Control:含
no-cache、private、max-age=0时,Nginx 默认跳过缓存 - Expires:设为 1970-01-01 或任意过去时间,Nginx 会直接拒缓
-
Set-Cookie:哪怕只是
_ga=xxx这类埋点 Cookie,Nginx 默认整条响应不缓存 -
Vary:如
Vary: User-Agent会导致同一 URL 生成多份缓存,大幅降低命中率
配置位置和写法要点
这个指令极依赖上下文,错一处就失效:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 只能写在启用了缓存的
location块内(不能放http或server顶层) - 必须出现在
proxy_pass之前,且最好紧邻它 - 头名严格区分大小写,用空格分隔,不加引号、逗号或括号:
proxy_ignore_headers Cache-Control Expires Set-Cookie Vary; ✅
proxy_ignore_headers cache-control expires; ❌
忽略之后必须补上自己的规则
它只是“松绑”,不是“自动缓存”。你得明确告诉 Nginx 怎么缓:
- 用
proxy_cache_valid定义缓存周期:
proxy_cache_valid 200 302 1h;(成功响应缓 1 小时)
proxy_cache_valid 404 1m;(错误页只缓 1 分钟) - 防透传干扰头:
proxy_hide_header Set-Cookie;
proxy_hide_header Cache-Control; - 对外分发建议注入标准头:
add_header Cache-Control "public, max-age=3600" always;
验证是否真正生效
别只看配置文件,要看运行态表现:
- 用
curl -I请求同一 URL 两次:首次X-Cache-Status: MISS,二次HIT→ 缓存已命中 - 响应头里仍能看到
Cache-Control: no-cache→ 说明是“被无视”,不是“被删除”,配置起效 - Nginx 日志中
$upstream_cache_status字段不再显示BYPASS(否则可能是被proxy_no_cache等意外拦截)










