必须用组合策略:proxy_hide_header server 仅对首次代理生效,缓存命中时失效;需配合 add_header server "proxy" always 覆盖缓存响应头,并设置 server_tokens off 防 nginx 自身泄露版本。

要让 Nginx 缓存响应中也不暴露后端源服务器信息(如 Server: Apache/2.4.52 或 Server: nginx/1.21.6),不能只靠 proxy_hide_header Server —— 它在缓存命中时完全不生效。必须用组合策略,覆盖“首次代理”和“缓存返回”两种路径。
缓存响应里 proxy_hide_header 为什么失效
Nginx 缓存模块(proxy_cache)命中时,直接返回之前存下来的完整响应体和响应头,包括原始的 Server 头。此时所有 proxy_* 指令(含 proxy_hide_header)都不再运行。也就是说:一旦缓存里存了带 Server: Tomcat/9.0 的响应,后续所有命中该缓存的请求都会原样透传这个头。
三步确保缓存响应也干净
- 清空旧缓存并验证非缓存路径是否生效:临时加
proxy_cache_bypass $arg_nocache或设proxy_cache_valid any 0s,用curl -I "?nocache=1"确认proxy_hide_header Server在直连后端时确实起作用 - 精简缓存键,避免引入敏感变量:不要在
proxy_cache_key中使用$upstream_http_server这类可能携带后端标识的变量;推荐写法:proxy_cache_key "$scheme$request_method$host$request_uri"; - 用
add_header Server "Proxy" always覆盖最终输出:这个always标志让它作用于所有响应,包括缓存命中的响应,能真正覆盖掉缓存里原有的Server头
必须配合禁用 Nginx 自身版本头
仅处理后端头还不够。server_tokens off 要放在 http 或 server 块中,防止 Nginx 自己在错误页、重定向响应等场景中泄露 Server: nginx/1.24.0。它不影响缓存逻辑,但属于基础安全项,漏掉会导致部分响应仍暴露版本。
完整 location 配置示例
以下配置同时解决首次代理与缓存响应的 Server 头污染问题:
server_tokens off;
location /api/ {
proxy_pass https://backend;
proxy_cache my_cache;
proxy_cache_valid 200 5m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_hide_header Server;
add_header Server "Proxy" always;
}











