proxy_hide_header 仅屏蔽后端响应头透传,需配合 add_header ... always 才能实现网关级缓存控制;必须先 hide 再 add,且需清理旧缓存验证生效。

直接用 proxy_hide_header 无法“拦截”请求,它只作用于后端返回的响应头,目标是清理发往浏览器的敏感缓存控制头(如 Cache-Control、Expires),防止它们干扰网关层统一缓存策略。关键不是“拦截”,而是屏蔽透传 + 主动覆盖。
必须先屏蔽后端自带的缓存头
后端若返回 Cache-Control: no-cache 或 Expires: Wed, 01 Jan 1970 00:00:00 GMT,Nginx 默认会原样转发——这会直接覆盖你配置的 proxy_cache_valid 规则。必须显式禁止透传:
-
proxy_hide_header Cache-Control; -
proxy_hide_header Expires;
这两行必须写在proxy_pass之后,且仅对当前location生效。
注意:
proxy_hide_header不影响 Nginx 缓存逻辑本身,它只删响应头;要真正让缓存策略生效,还需配合下一步。
接着用 add_header ... always 强制注入网关级缓存头
单纯隐藏不够,浏览器需要明确收到你指定的缓存指令。用 always 参数确保所有响应(包括 304、4xx、5xx)都携带:
-
add_header Cache-Control "public, max-age=3600" always; -
add_header Expires "" always;
Expires "" 是清空该头的有效写法;不加 always 时,错误响应不会带这些头,导致浏览器按默认规则处理(比如不缓存 500 响应,但你可能希望缓存 10 秒兜底)。
同时避免缓存头被错误继承或叠加
如果启用了 proxy_cache,需额外注意:
- 后端响应中若含多个
Cache-Control(极少见),proxy_hide_header会全部移除; - 若缓存中已存有旧响应(含未隐藏的头),新配置不会自动刷新缓存,需手动清理或启用
proxy_cache_purge; - 不要依赖
add_header覆盖——它是追加行为,而浏览器通常取第一个Cache-Control,所以必须先hide再add。
验证是否真正生效
别只测一次请求:
- 清空缓存:
rm -rf /path/to/cache/* - 发起两次相同请求,用
curl -I对比响应头; - 第二次响应中
Age头应大于 0(确认命中缓存),且Cache-Control值必须是你add_header设定的,不能出现后端残留值。
不复杂但容易忽略。











