必须从响应头、错误页、HTTP方法、后端透传四层面同步收敛才能真正屏蔽Web服务器版本探测:在http块设server_tokens off,location中proxy_pass后加proxy_hide_header Server及proxy_set_header Server "",用more_clear_headers彻底删Server头,拦截并清理404/502等错误页硬编码信息,同时过滤X-Powered-By等指纹头,并禁用TRACE等高危HTTP方法。

要真正屏蔽针对 Web 服务器版本与模块功能的探测,不能只改一个配置项,得从响应头、错误页、HTTP 方法、后端透传四个层面同步收敛。单靠 server_tokens off 或 proxy_hide_header Server 都会漏掉关键路径。
清除所有 Server 头暴露点
Nginx 自身和后端服务可能在不同位置输出 Server 信息,必须分层清理:
- 在
http{}块中全局关闭版本号:server_tokens off;(让Server: nginx/1.24.0变成Server: nginx) - 在启用反向代理的
location块中,必须放在proxy_pass之后,写上:proxy_hide_header Server;(屏蔽 Tomcat/Apache/Spring Boot 返回的Server: Apache-Coyote/1.1等) - 为防某些 Nginx 版本残留,加一句:
proxy_set_header Server "";(主动清空该头字段) - 若需彻底删除 Server 头(而非仅隐藏版本),需编译安装
headers-more-nginx-module,再用:more_clear_headers "Server";
堵住错误页里的硬编码泄露
即使响应头干净了,404、502 页面的 HTML 源码里仍可能嵌入版本痕迹:
- 访问一个不存在的路径(如
/nonexist),查看返回 HTML 源码,确认没有nginx/、Apache/、Tomcat/等字样 - 若发现残留,在
http{}或server{}中启用错误页拦截:proxy_intercept_errors on; - 定义兜底页面:
error_page 404 500 502 503 504 /50x.html; - 确保
/50x.html是纯静态文件,不包含任何注释、JS 变量或服务标识
一并过滤其他指纹型响应头
攻击者常交叉比对多个头来确认技术栈,不能只盯 Server:
-
proxy_hide_header X-Powered-By;(屏蔽 PHP/8.2、Express、Spring Boot 等) -
proxy_hide_header X-AspNet-Version;(ASP.NET 场景) proxy_hide_header X-AspNetMvc-Version;-
proxy_hide_header X-Runtime;(Ruby on Rails) - PHP-FPM 侧还需修改 fastcgi_param:
fastcgi_param SERVER_SOFTWARE nginx;(去掉/$nginx_version)
禁用高风险 HTTP 方法与调试接口
版本探测常配合 TRACE、OPTIONS、PUT 等方法进行试探:
- 在
server{}或location{}中限制方法:limit_except GET HEAD POST { deny all; } - 显式禁用 TRACE:
if ($request_method = 'TRACE') { return 405; } - 关闭 Apache 的
ServerSignature Off和ServerTokens Prod - 禁用 Tomcat 的
showServerInfo(在conf/web.xml中设display-source为 false)


















