nginx 默认跳过含 set-cookie 的上游响应缓存,需配置 proxy_ignore_headers set-cookie 和 proxy_hide_header set-cookie 并配合 proxy_cache 等指令,仅当响应无用户身份信息且无 cache-control 禁用指令时才可安全启用。

当上游响应带 Set-Cookie 时,Nginx 默认跳过缓存——这不是配置失效,而是内置安全策略。要让缓存生效,关键不是删除 Cookie,而是让 Nginx 在缓存决策阶段忽略它,并阻止其透传给客户端。
确认是否适合强制缓存
只有响应内容完全不包含用户身份信息时,才可安全启用。典型无害场景包括:
- 未登录首页返回的匿名统计 Cookie(如
_ga=GA1.2.xxxx) - 全局只读接口(如
/api/config)为兼容旧逻辑返回的空或固定值 Cookie - Next.js 的
/_next/static/资源被框架自动注入,但实际不依赖会话 - 响应头中没有
Cache-Control: private、no-store等明确禁止缓存的指令
核心缓存配置(必须写在 location 块内)
以下指令需放在启用缓存的 location 中,且必须位于 proxy_pass 之前:
-
proxy_ignore_headers Set-Cookie;—— 让 Nginx 在判断是否缓存时忽略该头(大小写严格匹配,不能写成set-cookie) -
proxy_cache my_cache;和proxy_cache_valid 200 302 10m;—— 显式启用缓存及设置有效期 - 若需同时忽略多个头,可用空格分隔:
proxy_ignore_headers Set-Cookie Cache-Control;
配套防护:防止透传与污染
仅忽略不足以保障安全,还需主动拦截和隔离:
-
proxy_hide_header Set-Cookie;—— 彻底移除该头,避免浏览器错误保存或后续请求携带 - 禁用
proxy_cache_use_stale updating;—— 防止后台更新缓存期间,旧响应(可能含误设 Cookie)被错误复用 - 建议添加
add_header X-Cache-Status $upstream_cache_status;,用于验证缓存命中状态
验证是否真正生效
发起两次相同请求,检查响应头:
- 首次响应含
X-Cache-Status: MISS→ 进入缓存流程 - 第二次响应含
X-Cache-Status: HIT→ 缓存已启用,且未被Set-Cookie阻断 - 响应中不再出现
Set-Cookie头 →proxy_hide_header生效











