需组合配置才能彻底隐藏Server头:①server_tokens off关闭Nginx版本暴露;②proxy_hide_header Server在proxy_pass后屏蔽后端头;③proxy_set_header Server ""强制清空残留值,并同步屏蔽X-Powered-By等关联敏感头。

直接用 proxy_hide_header Server 可以移除后端返回的 Server 响应头(比如 Apache-Coyote/1.1、nginx/1.22.0 或 Microsoft-IIS/10.0),但单靠这一行往往不够——它只处理后端发来的头,不碰 Nginx 自己加的 Server 头,也不覆盖错误页中残留的标识。要真正防范针对版本漏洞的扫描和攻击,得组合配置、分层清理。
为什么 proxy_hide_header Server 单独写常失效
很多情况下写了 proxy_hide_header Server,curl 一测还是能看到后端 Server 字段,常见原因有:
- 指令位置错误:没放在
proxy_pass之后,Nginx 忽略该配置 - 作用域遗漏:在
http块里写了,但没在具体location中重复声明,而该指令不继承 - 错误页面绕过:404、502 等响应由后端直接生成 HTML 页面,其中内嵌的
Server字段未被 header 层过滤 - Nginx 自身头干扰:客户端看到的
Server: nginx/1.24.0其实是 Nginx 自己加的,跟proxy_hide_header无关
完整移除后端 Server 标识的三步操作
必须同时处理“后端透传的头”、“Nginx 自带的头”和“潜在残留”,缺一不可:
-
关闭 Nginx 版本暴露:在
http、server或location块中加server_tokens off;,让 Nginx 只输出Server: nginx,不带版本号 -
屏蔽后端原始 Server 头:在含
proxy_pass的location内,且必须写在proxy_pass后面,添加proxy_hide_header Server; -
主动清空可能残留值:加上
proxy_set_header Server "";,强制覆盖任何已存在的Server值(注意:这是请求头指令,但部分 Nginx 版本在响应阶段会配合生效)
还需同步隐藏的关联敏感头
攻击者常结合多个头交叉判断技术栈,只删 Server 不够。以下头建议一并屏蔽:
-
X-Powered-By:暴露语言/框架(如Express、PHP/8.2.12、Spring Boot) -
X-AspNet-Version:.NET 应用专属,直接暴露运行时版本 -
X-Application-Context:Spring Boot 默认返回application:prod,泄露部署环境 -
X-Runtime:Rails 或 Java 中间件返回请求耗时,间接反映服务架构
每行单独写,例如:
proxy_hide_header X-Powered-By;<br>proxy_hide_header X-AspNet-Version;<br>proxy_hide_header X-Application-Context;
验证是否真正生效
改完配置后 reload,用 curl 检查真实响应头:
curl -I https://your-domain.com/api/test
重点关注:
– 是否还存在 Server:、X-Powered-By: 等字段
– 返回状态码为 500 或 404 时,再测一次(防错误页漏网)
– 若用了 HTTPS,确认证书域名与 Host 匹配,避免因 SNI 问题回退到默认 server 块导致配置未命中











