proxy_hide_header可屏蔽后端响应头如X-Powered-By、Server(上游)等,但不影响Nginx自身头;需配合server_tokens off隐藏Nginx的Server版本号,且该指令仅在当前location生效、须置于proxy_pass之后。

直接用 proxy_hide_header 就能删掉上游返回的特定响应头,比如 X-Powered-By、Server(后端的)、X-AspNet-Version 这类暴露技术栈的字段。它不改响应体,也不影响 Nginx 自己加的头——想关掉 Nginx 的 Server 版本号,得配 server_tokens off。
哪些响应头该优先隐藏
后端服务(Spring Boot、Express、ASP.NET 等)常默认注入标识性头,这些是攻击面入口:
-
X-Powered-By:暴露语言/框架版本,如Express或PHP/8.1 -
X-Application-Context:Spring Boot 常带环境信息,如application:prod -
X-Runtime、X-Generator:泄露运行时耗时或 CMS 类型 -
Server(上游的):虽不能屏蔽 Nginx 自己的Server,但能干掉后端 Apache/Tomcat 的原始值 -
X-XSS-Protection、X-Frame-Options:若由 Nginx 统一管控安全策略,就别让后端重复或冲突输出
配置写法与作用域要点
这个指令只在当前 location 或 server 块里生效,且必须写在 proxy_pass 之后才起作用:
- 错误写法:
proxy_hide_header放在proxy_pass前 → 不生效 - 不能跨块继承:父
http块设了,子location里还得再写一遍 - 不处理关键系统头:
Content-Length、Set-Cookie、Location无法用它删除(Set-Cookie要用proxy_cookie_domain/path,Location要用proxy_redirect) - 多个同名头会全部屏蔽:比如后端用了两次
X-Trace-ID,proxy_hide_header X-Trace-ID会一起干掉
配合其他指令完成完整响应头治理
单靠 proxy_hide_header 不够,实际场景需组合使用:
- 先删后端敏感头:
proxy_hide_header X-Powered-By; proxy_hide_header X-AspNet-Version; - 再统一加安全头:
add_header X-Content-Type-Options nosniff; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; - 重写跳转地址:
proxy_redirect http://internal-api/ https://api.example.com/; - 修正 Cookie 域名路径:
proxy_cookie_domain ~^(.*)$ example.com; proxy_cookie_path /app/ /; - 关掉 Nginx 自身版本标识:
server_tokens off;(放在http或server块)
验证是否真的生效
别只信配置文件,一定要实测:
- 用
curl -I https://your-domain.com/api/test查看原始响应头 - 对比修改前后:确认目标头(如
X-Powered-By)已消失,且没误删关键头(如Content-Security-Policy) - 分路径测试:API 接口、静态资源、404/500 错误页可能返回不同头,都要覆盖到
- 注意错误页例外:Nginx 默认错误页仍可能含
Server字段,建议自定义错误页并清理 HTML 中的冗余信息











