真正隐藏后端服务器版本号需三步:在http块加server_tokens off隐藏nginx版本;在proxy_pass所在location块加proxy_hide_header server等指令屏蔽后端头;通过error_page配合more_clear_headers或lua清除错误页中残留server头,并用curl对200/404/502全场景验证。

要真正隐藏后端服务器版本号,不能只关 Nginx 自己的版本显示,还得切断后端返回的 Server、X-Powered-By 等头字段,并覆盖错误页里残留的标识。实操中三类响应最容易漏检:正常 200、502 错误、404 页面——必须全测。
关闭 Nginx 自身版本号输出
在 http 块中添加:
-
server_tokens off; —— 这会把
Server: nginx/1.24.0变成Server: nginx - 该指令不删除 Server 头本身,仅隐藏版本号;若想彻底去掉这个头,需配合后续步骤
- 不要只放在某个 server 块里测试,全局生效更稳妥,避免遗漏子域名或新站点
屏蔽后端返回的 Server 和其他指纹头
在包含 proxy_pass 的 location 块内添加:
-
proxy_hide_header Server; —— 拦截后端如 Tomcat、Flask、Spring Boot 返回的
Server: Apache-Coyote/1.1或Server: Werkzeug/2.3.7 - proxy_hide_header X-Powered-By; —— 常见于 PHP、ASP.NET、Node.js 应用
- proxy_hide_header X-AspNet-Version;、proxy_hide_header X-AspNetMvc-Version; —— 针对 .NET 生态
- 这些指令必须和
proxy_pass在同一个 location 内,写在 http 或 server 块里无效
清除错误页中的 Server 头(关键难点)
Nginx 自己生成的 404、502、503 页面仍会带 Server: nginx,这是最常被忽略的泄露点:
- 启用错误页拦截:proxy_intercept_errors on;
- 自定义错误响应:error_page 404 /404.html; error_page 500 502 503 504 /50x.html;
- 在对应 location 中使用 more_clear_headers 'Server';(需安装
headers-more-nginx-module) - 或用 OpenResty + Lua:header_filter_by_lua_block { ngx.header.Server = nil }
- 测试时务必停掉后端服务,访问一个路径触发 502,再用
curl -I检查响应头
验证是否生效
配置重载后执行以下检查:
-
curl -I http://your-domain.com/normal-path—— 确认无后端 Server、无 Nginx 版本号 -
curl -I http://your-domain.com/nonexistent—— 触发 404,确认无 Server 头 -
curl -I http://your-domain.com/api-that-fails—— 触发 502,确认无 Server 头 - 注意 CDN、WAF 或浏览器缓存可能掩盖结果,建议加
-H "Cache-Control: no-cache"或换 IP 测试











