proxy_ignore_headers 是让 nginx 忽略后端 cache-control、expires、set-cookie、vary 四个响应头以接管缓存决策的指令,须置于启用缓存的 location 块中 proxy_pass 之前,配合 proxy_cache_valid 等规则生效。

proxy_ignore_headers 是 Nginx 反向代理缓存中接管缓存决策权的关键指令,它不删除响应头,而是让 Nginx 在判断是否缓存、缓存多久时“不看”某些干扰性头部。要让它和 proxy_cache 正确协同工作,必须满足位置、顺序、配套三要素。
必须写在启用缓存的 location 块内,且紧邻 proxy_pass
该指令只在明确启用了缓存的 location 中生效,不能放在 http 或 server 块顶层(除非所有子 location 都统一启用缓存)。更重要的是:
- 必须出现在
proxy_pass之前 - 必须与
proxy_cache、proxy_cache_valid等指令处于同一 location 块
✅ 正确示例:
location /static/ {
proxy_pass http://backend;
proxy_ignore_headers Cache-Control Expires Set-Cookie Vary;
proxy_cache my_cache;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
}
❌ 错误写法(常见失效原因):
- 写在
proxy_pass之后 → Nginx 忽略该指令 - 写在
server { }块里但未在 location 中重复声明 → 不生效 - 头部名称大小写错误,如
cache-control或set-cookie→ 不识别
要忽略哪些头?按实际干扰类型选填
Nginx 默认受以下四个响应头影响最大,是否全写取决于后端行为:
-
Cache-Control:含no-cache、private、no-store、max-age=0时,默认跳过缓存 -
Expires:设为1970-01-01或过去时间,直接否决缓存 -
Set-Cookie:哪怕只是_ga=xxx这类埋点 Cookie,Nginx 默认拒缓整条响应 -
Vary:如Vary: User-Agent会导致同一 URL 生成多份缓存,命中率暴跌
⚠️ 注意:多个头名用空格分隔,严格区分大小写,不可加引号或逗号
正确:proxy_ignore_headers Cache-Control Expires Set-Cookie;
错误:proxy_ignore_headers "Cache-Control", Expires;
忽略之后,必须立刻配自己的缓存规则
proxy_ignore_headers 是“松绑”,不是“自动缓存”。它只是移除了障碍,你得马上告诉 Nginx 怎么缓:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
proxy_cache_valid是必配项,例如:proxy_cache_valid 200 302 1h;→ 成功响应统一缓存 1 小时proxy_cache_valid 404 1m;→ 404 错误页缓存 1 分钟,防击穿 - 若需支持更多状态码,显式列出,避免用通配符(如
200 1h会漏掉 301/302)
同时确保 http 块中已定义缓存区:
proxy_cache_path /var/cache/nginx/mycache levels=1:2 keys_zone=mycache:10m max_size=1g;
配套防护:防透传、防误解、防污染
忽略头 ≠ 安全放行。还需补三步:
隐藏透传头(防止客户端被误导):
proxy_hide_header Cache-Control;proxy_hide_header Expires;proxy_hide_header Set-Cookie;主动注入可信缓存头(可选,面向浏览器/CDN):
add_header Cache-Control "public, max-age=3600" always;确认响应体无敏感数据:
若忽略Set-Cookie或Cache-Control: private,务必检查响应内容是否含 session ID、CSRF token、手机号、用户昵称等——否则可能造成缓存污染或信息泄露。
怎么验证真生效了?
别只 reload 配置,看运行态表现:
- 用
curl -I请求同一 URL 两次:
首次返回X-Cache-Status: MISS,第二次为HIT→ 缓存已介入 - 响应头里仍能看到
Cache-Control: no-cache→ 说明是“被忽略”,不是“被删除”,配置起效 - 响应时间明显下降,且后端访问日志不再频繁触发 → 回源减少
如需深度排查,可开启 debug 日志并搜索 cache status 或 ignore header 相关行。










