server_tokens off 必须写在 http 块内才生效,写在 server 或 location 块中会被 Nginx 忽略;它有 on/off/build/string 四种取值,生产环境仅推荐 off;还需同步处理 PHP、后端服务及系统横幅等泄露点。

server_tokens off 必须写在 http 块里才生效
这个指令只在 http { } 作用域下起作用,写在 server 或 location 块里会被 Nginx 忽略——不是“没效果”,而是压根不识别。很多用户改了半天发现还是显示 Server: nginx/1.26.3,问题就出在这里。
打开主配置文件(通常是 /etc/nginx/nginx.conf 或宝塔的 /www/server/nginx/conf/nginx.conf),找到 http { 开头的位置,在它内部、与 include mime.types; 同级处添加:
server_tokens off;
- 分号不能漏,也不能写成
server_tokens = off或加引号 - 如果用了
include sites-enabled/*.conf,务必检查子配置里有没有server_tokens on;——它会覆盖主配置 - 注释掉该行 ≠ 关闭,必须显式写为
off
验证时要同时检查响应头和错误页源码
只看 curl -I 的 Server 头是不够的。Nginx 在 404、500 等默认错误页 HTML 底部也会硬编码版本信息,比如 或 nginx version 字样。
验证步骤必须包含两步:
-
curl -I https://your-domain.com | grep Server→ 应只输出Server: nginx或完全不出现该字段 - 访问一个不存在路径(如
/nonexistent),用浏览器“查看网页源码”或curl https://your-domain.com/nonexistent,搜索nginx/、version、操作系统名等字样
若错误页仍泄露,说明配置没生效,或被 CDN(如 Cloudflare)回源时覆盖了响应头。
server_tokens 的取值差异直接影响暴露程度
server_tokens 不是布尔开关,它有四个可选值,行为差别明显:
-
on(默认)→Server: nginx/1.26.3 -
off→Server: nginx,且错误页不渲染版本字符串 -
build→Server: nginx/1.26.3 (Ubuntu),含构建信息,仅调试用 -
string→ 需配合more_set_headers 'Server: WebServer';(需安装headers-more-nginx-module)
生产环境只推荐 off。别用 string 搞花活,除非你已确认模块已编译并启用,否则配置会报错。
隐藏版本号只是第一步,PHP 和上游服务还在泄密
server_tokens off 只管 Nginx 自己输出的内容。真实环境中,还有至少三个常见泄露点:
- PHP:检查
php.ini中expose_php = Off,否则会返回X-Powered-By: PHP/8.3.12 - 反向代理后端:Tomcat、Node.js 等返回的
Server头,需在对应location块加proxy_hide_header Server; - 系统横幅:SSH 登录前的
/etc/issue和/etc/motd若含内核或发行版信息,也属于指纹泄露
安全加固不是改一行配置就完事。真正难的,是把所有能拼出“你是谁”的碎片都清干净。











