需在location块中配置proxy_pass_header、proxy_ignore_headers和add_header always,并关闭expires指令,才能确保cache-control、expires等缓存头穿透nginx网关抵达cdn或客户端。

直接在对应 location 块中启用 proxy_pass_header,并配合 proxy_ignore_headers 和 add_header always,才能让特定缓存控制头(如 Cache-Control、Expires)真正穿透网关、抵达 CDN 或客户端。
明确允许透传缓存控制头
默认情况下,Nginx 会过滤掉部分响应头,包括 Cache-Control 和 Expires(尤其在启用缓存时)。要让它们通过,需显式放行:
- 在
location块中添加:proxy_pass_header Cache-Control; - 同理添加:
proxy_pass_header Expires; - 注意:这两行必须与
proxy_pass在同一作用域(不能写在 if 或其他嵌套块里) - 大小写不敏感,但建议保持原始命名风格(如首字母大写)
先解除 Nginx 对这些头的自动忽略
Nginx 默认可能已将这些头列入忽略列表(尤其在 proxy_cache 开启时),仅靠 proxy_pass_header 不足以生效。需同步清除干扰:
- 添加
proxy_ignore_headers Cache-Control Expires;—— 这会让 Nginx 忽略后端返回的这些值,避免其干扰网关层缓存策略 - 该指令确保 Nginx 不受后端
Cache-Control: no-cache等影响,为后续统一注入铺路 - 若后端还返回
Pragma,也建议一并加入忽略列表
用 add_header always 主动注入可控值
proxy_pass_header 只是“不拦截”,不代表后端一定返回了这些头。更可靠的做法是网关层兜底注入:
- 添加:
add_header Cache-Control "public, max-age=3600" always; - 添加:
add_header Expires "" always;(空字符串可有效清空该头) -
always是关键:确保即使响应是 4xx/5xx 或缓存命中,头依然发出 - 这样既避免依赖后端输出,又保障 CDN 或浏览器收到一致、可预期的缓存指令
配套关闭 Nginx 自动添加的过期逻辑
防止 Nginx 内部机制与你手动注入的头冲突:
- 添加:
expires off;—— 关停 Nginx 基于expires指令生成的Expires和Cache-Control - 添加:
add_header Cache-Control "" off;(或类似方式)避免重复设置 - 特别注意:如果同时用了
proxy_cache,还需确认proxy_cache_valid规则与你透传/注入的头语义一致











