必须用 proxy_hide_header 配合 server_tokens off 和 proxy_set_header server ""; 并自定义错误页,才能彻底隐藏敏感响应头;需在 location 块中 proxy_pass 后逐行配置,不可通配或错位。

直接用 proxy_hide_header 不能“强行拦截”,它本质是响应头过滤器,只在 Nginx 接收后端响应后、转发给客户端前起作用。要真正隐藏敏感头,必须明确目标头、写对位置、配齐配套措施。
必须屏蔽的敏感响应头有哪些
这些头在真实流量中高频暴露技术栈,是扫描器第一抓取目标:
-
Server:后端真实服务器标识,如
Tomcat/9.0.83、gunicorn/21.2.0 -
X-Powered-By:框架语言线索,如
Express、PHP/8.1.2、Spring Boot/3.1.0 -
X-Application-Context:Spring Boot 默认带环境名,如
application:prod - X-AspNet-Version、X-Runtime、X-Generator:分别指向 .NET、Rails、WordPress 等生态
- X-Debug-Token、X-Trace-ID(非必要透传时):可能关联调试日志或内部追踪系统
配置必须写在正确位置
这个指令不生效,90% 是因为位置错了:
- 必须紧接在
proxy_pass之后,写在它前面完全无效 - 只在当前
location块内生效,http或server块中声明不会继承 - 每个头单独一行,不支持逗号分隔或通配符(
proxy_hide_header X-*;是非法语法) - 大小写不敏感,但推荐标准写法,例如
proxy_hide_header Server;而非server
单靠 proxy_hide_header 不够,要三步闭环
只加几行 proxy_hide_header 很容易被绕过,真正清除需同步完成:
- 关闭 Nginx 自身版本输出:
server_tokens off;(建议放在http块,全局生效) - 屏蔽后端透传的敏感头:
proxy_hide_header Server;、proxy_hide_header X-Powered-By;等(写在对应location内、proxy_pass后) - 强制清空残留值:
proxy_set_header Server "";(同一location中,覆盖可能被自动补上的 Server 头)
别忘了错误页这个漏网之鱼
即使响应头全清了,404、502 页面仍可能硬编码泄露信息:
- Spring Boot 的 Whitelabel 错误页默认显示
Whitelabel Error Page和版本 - Nginx 默认 502 页面会显示
nginx/1.24.0等字样 - 必须用
error_page 404 /404.html;和error_page 502 503 504 /5xx.html;自定义错误页 - 同时确保后端关闭调试模式(如 Spring Boot 的
server.error.include-stacktrace=never)











