server_tokens off必须置于nginx.conf的http块内全局配置,并检查所有include子配置是否覆盖,重载后用curl -I验证响应头及错误页是否彻底隐藏版本号。

nginx.conf 里必须设置 server_tokens off
这是最直接有效的手段,但很多人只改了主配置却忽略 include 的子配置。Nginx 启动时会加载 /etc/nginx/nginx.conf,而它通常通过 include /etc/nginx/conf.d/*.conf 或 include /etc/nginx/sites-enabled/* 引入虚拟主机配置——这些文件里如果写了 server_tokens on 或压根没写,都会覆盖全局设置。
实操建议:
- 全局配置(
/etc/nginx/nginx.conf)的http块内添加server_tokens off;,不要放在server块里 - 检查所有被
include的 conf 文件,确保没有重复定义或显式开启server_tokens - 修改后必须执行
sudo nginx -t验证语法,再sudo systemctl reload nginx生效
curl -I 测试响应头是否真的隐藏了 Server 字段
仅靠配置不等于生效。常见错误是 reload 失败但没报错,或者用 systemctl restart nginx 时因配置错误导致服务未真正重启。实际请求中,若仍看到 Server: nginx/1.18.0,说明配置未生效或被覆盖。
验证方法:
- 在终端运行
curl -I http://your-domain.com,观察响应头是否有Server:行 - 如果仍有
Server字段,用nginx -T | grep server_tokens查看最终合并后的配置,确认生效位置 - 注意:某些 CDN 或反向代理(如 Cloudflare)会覆盖原始
Server头,此时需在真实回源 IP 上测试
编译安装时禁用版本号更彻底,但多数人不需要
源码编译 Nginx 时可通过 --with-http_stub_status_module 等参数控制模块,但隐藏版本号的关键是修改源码中的 src/core/nginx.h 文件,把 #define NGINX_VERSION "1.24.0" 改为空字符串,再重新编译。这种方式能彻底移除响应体中可能泄露版本的错误页(比如 404 页面底部的 “nginx/1.24.0”)。
但要注意:
- 二进制包(apt/yum 安装)无法通过此方式修改,只能依赖
server_tokens off - 错误页里的版本号默认仍存在,除非自定义
error_page并替换 HTML 模板 - 运维成本高:每次升级都要重新编译,且失去包管理器的安全更新支持
别忘了错误页面和重定向响应里的版本信息
server_tokens off 只影响 HTTP 响应头的 Server 字段,不影响 Nginx 默认错误页(如 502、404)HTML 源码中自带的版本字样,也不影响 Location 重定向头里可能带出的版本标识(极少见,但某些老旧模块或第三方模块会拼接)。
处理方式:
- 用
error_page 404 /404.html指向自定义静态页,并确保该 HTML 不含 Nginx 版本字串 - 检查
fastcgi_pass或proxy_pass后端返回的响应头,某些 PHP-FPM 或上游服务会透传或伪造Server头 - 若使用 OpenResty 或 Nginx Plus,部分指令(如
more_clear_headers)可强制删除特定头,但标准 Nginx 不支持
配置真正生效的关键,往往卡在多层 include 的覆盖、reload 未成功、或测试环境被中间件干扰。版本号不是“关掉就完事”,而是要逐层确认响应头与响应体两个维度是否都干净。











