要真正隐藏服务器版本号,需三步:在http块设server_tokens off隐藏nginx自身版本;在proxy_pass所在location块用proxy_hide_header屏蔽后端server、x-powered-by等头;通过more_clear_headers或源码编译彻底删除server字段,并对200/404/502全场景验证。

要移除 Nginx 响应头中的敏感服务器标识(如 Server: nginx/1.26.2),不能只靠单一配置,需分层处理:既要控制 Nginx 自身输出的标识,也要拦截后端服务透传的指纹头。实际生效的关键在于组合使用原生指令与可选模块,而非依赖某一种“万能开关”。
关闭 Nginx 自身版本暴露
server_tokens off 是最基础且必须启用的配置,它让 Nginx 不在响应头和错误页中显示具体版本号:
- 写在
http块中实现全局生效(推荐);写在server或location块中则按作用域局部生效 - 生效后,
Server: nginx/1.26.2变为Server: nginx,但字段仍存在 - 同时影响 404、502 等错误页面的 HTML 源码——这些页面里硬编码的版本文字也会被抹去
拦截后端返回的 Server 和其他敏感头
如果你用 Nginx 做反向代理,后端(如 Spring Boot、Tomcat、PHP-FPM)可能自己返回 Server、X-Powered-By、X-AspNet-Version 等头,proxy_hide_header 就是用来清理这些的:
- 必须放在含
proxy_pass的location块内,每行一个头,例如:proxy_hide_header Server;proxy_hide_header X-Powered-By; - 注意:它对 Nginx 自己生成的
Server头无效,只处理后端响应 - 常见误用是把它和
proxy_set_header混淆——后者改的是发给后端的请求头,不是响应头
彻底删除或替换 Server 字段(需额外模块)
若要求响应头里连 Server: nginx 都不出现,有两条路径:
-
用 headers-more-nginx-module:支持原生 Nginx 二进制不动的前提下删或改头
在http或server块中加:more_clear_headers 'Server';(完全删除)
或more_set_headers 'Server: web-server';(自定义值) -
源码重编译(高级):修改
src/core/nginx.h和src/http/ngx_http_header_filter_module.c,清空版本宏与 server 字符串,再 configure → make → install
注意复用原nginx -V输出的参数,避免丢失 HTTP/2、SSL 等关键模块
验证是否真正生效
改完配置 reload 后,别只测首页 200 响应:
- 用
curl -Ik https://your-domain.com查看 HTTPS 响应头(-k忽略证书错误) - 手动访问一个不存在路径(如
/notfound),检查 404 页面源码是否还有nginx/字样 - 测试 API 接口路径(如
/api/v1/status),确认代理路径下的响应头也被清理











