应使用 proxy_ignore_headers 屏蔽 Cache-Control、Expires、Set-Cookie、Vary 四类响应头,需置于启用缓存的 location 块内且在 proxy_pass 之前,配合 proxy_cache_valid、proxy_hide_header 及内容安全校验确保缓存有效与安全。

要让 Nginx 在 proxy_pass 代理时忽略后端返回的不安全或干扰性响应头(比如 Set-Cookie、Cache-Control、Expires、Vary 等),核心不是“忽略”本身,而是通过 proxy_ignore_headers 主动屏蔽这些头,从而收回缓存与透传控制权。
哪些头需要被 ignore?
以下四类响应头最常导致缓存失效、Cookie 泄露或缓存碎片,是重点屏蔽对象:
-
Cache-Control:含
no-cache、private、no-store时,Nginx 默认不缓存 -
Expires:设为过去时间(如
Thu, 01 Jan 1970 00:00:00 GMT)会直接跳过缓存 - Set-Cookie:Nginx 默认拒绝缓存任何带该头的响应(哪怕只是埋点 Cookie)
-
Vary:如
Vary: User-Agent或Vary: Cookie会导致同一 URL 缓存多份,大幅降低命中率
正确配置 proxy_ignore_headers
该指令必须写在启用缓存的 location 块内,且严格位于 proxy_pass 之前。多个头名用空格分隔,大小写敏感:
示例:
location /static/ {
proxy_cache my_cache;
proxy_ignore_headers Cache-Control Expires Set-Cookie Vary;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
proxy_pass http://backend;
}
⚠️ 注意:proxy_ignore_headers 不生效的常见原因包括:放在 http 或 server 块顶层、写在 proxy_pass 之后、大小写错误(如写成 cache-control)。
配套动作不能少
仅屏蔽还不够,必须同步做三件事防止副作用:
-
显式定义缓存策略:用
proxy_cache_valid指定状态码与缓存时间,否则忽略后仍不缓存 -
阻止透传被忽略的头:加
proxy_hide_header Set-Cookie;和proxy_hide_header Cache-Control;,避免无效或敏感头泄露给客户端 -
确认内容安全:若响应体含 session ID、CSRF token、手机号等,绝不可忽略
Set-Cookie或Cache-Control: private
验证是否生效
用 curl -I 检查响应头中是否已不见被忽略的字段;开启 Nginx debug 日志并搜索 ignore header 或 cache status;自定义日志加入 $upstream_cache_status 实时观察 HIT/MISS。











