Nginx需用proxy_ignore_headers屏蔽Cache-Control、Expires、Set-Cookie、Vary头以忽略其缓存影响,再通过proxy_cache_valid、add_header和proxy_hide_header主动配置缓存策略与响应头。

要让 Nginx 忽略后端返回的静态文件缓存响应头(如 Cache-Control、Expires、Set-Cookie、Vary),核心是用 proxy_ignore_headers 指令“屏蔽”这些头对缓存决策的影响,再由 Nginx 主动设定缓存规则。这不是删除头,而是让 Nginx 在做缓存判断时“视而不见”。
明确忽略哪些缓存相关响应头
静态资源常见干扰头就这四个,必须在对应 location 中显式列出:
-
Cache-Control:后端返回
no-cache或max-age=0会直接阻止缓存 -
Expires:设为过去时间(如
1970-01-01)会让 Nginx 认为不可缓存 - Set-Cookie:哪怕只是埋点 ID,Nginx 默认拒绝缓存整条响应
-
Vary:例如
Vary: User-Agent会导致同一 URL 缓存多份,浪费空间且降低命中率
配置位置和写法要点
该指令只在启用缓存的 location 块中生效,且必须放在 proxy_pass 之前、proxy_cache 相关指令附近:
- 多个头名用空格分隔,大小写敏感:
proxy_ignore_headers Cache-Control Expires Set-Cookie Vary; - 不能写在
http或server全局块里(除非所有子 location 都启用缓存) - 不能换行、不能加标点,否则语法报错
忽略之后必须补上缓存策略
只忽略不配置,等于没做任何事。需同步完成三件事:
- 用
proxy_cache_valid明确指定状态码与缓存时长,例如:proxy_cache_valid 200 302 1y; - 用
add_header Cache-Control "public, immutable, max-age=31536000" always;向客户端注入安全、清晰的缓存指令 - 用
proxy_hide_header Set-Cookie;和proxy_hide_header Cache-Control;防止被忽略的错误头透传给浏览器
典型静态资源 location 示例
适用于构建产物(如 app.a1b2c3.js、style.d4e5f6.css):
location ~* \.[a-f0-9]{6,}\.(js|css|png|jpg|woff2)$ {
proxy_pass http://backend;
proxy_ignore_headers Cache-Control Expires Set-Cookie Vary;
proxy_cache my_cache;
proxy_cache_valid 200 302 1y;
add_header Cache-Control "public, immutable, max-age=31536000" always;
proxy_hide_header Set-Cookie;
proxy_hide_header Cache-Control;
add_header X-Cache-Status $upstream_cache_status;
}


















