Nginx 默认不透传上游 Cache-Control 响应头,因 expires、add_header 或 proxy_ignore_headers 等配置会覆盖或忽略它;需删除 proxy_hide_header Cache-Control、使用 proxy_pass_header Cache-Control 显式透传,或用 map + add_header 条件兜底。

这个问题很常见:Nginx 用 proxy_pass 转发请求后,上游服务返回的 Cache-Control 响应头“消失”了,浏览器或 CDN 拿不到缓存指令。根本原因不是 Nginx 主动删了它,而是默认配置下 Nginx 会重写或忽略某些响应头,尤其是当它认为自己需要“接管”缓存行为时。
确认是否被 Nginx 自动清除或覆盖
Nginx 默认不会透传所有响应头,尤其当启用了 expires、add_header 或缓存相关指令时,它可能覆盖或压制上游的 Cache-Control。检查配置中是否有以下干扰项:
-
expires指令(如expires 1h;)——它会强制设置Expires和Cache-Control: max-age=...,覆盖上游头 -
add_header Cache-Control ...—— 直接覆盖,且默认不继承上游值 -
proxy_ignore_headers Cache-Control;—— 显式忽略,需确认未误配
确保上游响应头被正确透传
在 location 或 server 块中显式启用透传:
- 添加
proxy_pass_request_headers on;(通常默认开启,但可确认) - 关键一步:加上
proxy_hide_header Cache-Control;的反向操作——即不要隐藏它;如果之前有这行,务必删除 - 更稳妥做法:用
proxy_pass_header Cache-Control;显式允许透传(Nginx 1.7.5+ 支持)
避免 add_header 覆盖,改用 proxy_set_header(仅限请求头)或条件透传
add_header 对响应头是“覆盖式”添加,且不保留上游同名头。若你只是想补全缺失的 Cache-Control,而非强制统一,推荐:
- 移除所有
add_header Cache-Control ... - 如需兜底逻辑(例如上游没返回时设默认值),可用
map+add_header条件化设置:
验证与调试技巧
快速定位问题:
- 用
curl -I http://your-nginx/查看 Nginx 返回的响应头,对比直接访问上游服务的结果 - 在 Nginx 配置中临时加
add_header X-Upstream-Cache-Control $upstream_http_cache_control;,确认上游是否真的返回了该头 - 检查日志:开启
log_format记录$upstream_http_cache_control和$sent_http_cache_control,比对差异

















