nginx 默认因上游 set-cookie 跳过缓存,需用 proxy_ignore_headers set-cookie 让缓存决策忽略该头,并配合 proxy_hide_header set-cookie 阻止透传;仅当响应无敏感数据且无 cache-control 禁用指令时才可安全启用。

上游响应带 Set-Cookie 时,Nginx 默认直接跳过缓存——这不是配置没生效,而是它的硬性规则。要让缓存真正工作,关键不是“删掉 Cookie”,而是让 Nginx 在决策阶段忽略它,并阻断其对客户端的影响。
确认是否属于可缓存的误设场景
先判断后端返回 Set-Cookie 是否真的无害。如果响应体含用户私有数据(如 session ID、token、登录态标识),强行缓存会引发严重安全问题。只有以下情况才适合启用缓存:
- 未登录首页返回的统计类 Cookie(如 _ga=GA1.2.xxxx)
- 全局只读接口(如 /api/config)为兼容旧逻辑返回的空或固定值 Cookie
- Next.js 的 /_next/static/ 资源被框架自动注入,但实际不依赖会话
- 响应头中无 Cache-Control: private、no-store 等禁止缓存指令
核心配置:让缓存决策忽略 Set-Cookie
proxy_ignore_headers Set-Cookie 必须写在启用缓存的 location 块内,且位于 proxy_pass 之前:
location /static/ {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_ignore_headers Set-Cookie; # 关键:告诉 Nginx 别因这个头放弃缓存
}
注意:Set-Cookie 字母大小写必须完全匹配;不能写在 http 或 server 顶层(除非该作用域下所有 location 都明确启用缓存);多个头可用空格分隔,例如 proxy_ignore_headers Set-Cookie Cache-Control;
配套防护:防止缓存污染与透传风险
忽略只是让缓存能存,但原始 Set-Cookie 仍可能被发给客户端,造成浏览器错误保存或后续请求携带不该有的 Cookie:
- 加 proxy_hide_header Set-Cookie;,彻底阻止该头返回给用户
- 禁用 proxy_cache_use_stale updating;,避免后台更新时旧缓存被错误复用
- 用 add_header X-Cache-Status $upstream_cache_status; 辅助验证命中状态
验证缓存是否真正生效
发起两次相同请求,观察响应头变化:
- 首次响应含 X-Cache-Status: MISS → 进入缓存流程
- 第二次响应含 X-Cache-Status: HIT → 缓存已启用且未被 Set-Cookie 干扰
- 响应中不再出现 Set-Cookie 头 → proxy_hide_header 生效











