server_tokens指令仅在http块内生效,写在server或location块中无效;必须全局配置于http作用域,删除各站点重复设置,经nginx -t验证后reload,并检查响应头与404页源码确认隐藏效果。

Nginx 的 server_tokens 指令不支持在 server 块中单独关闭以实现“单站版本号隐藏”——这是关键前提。它只在 http 作用域下生效,写在 server 或 location 块里完全无效,Nginx 不提供按站点粒度控制版本号显示的能力。
如果你的目标是“只对某个网站隐藏版本号”,实际可行的做法只有两种:
必须写在 http 块中,全局统一管理
这是唯一真正生效的方式:
- 编辑主配置文件(如
/etc/nginx/nginx.conf或宝塔的/www/server/nginx/conf/nginx.conf) - 找到
http {开头的位置,在其内部、与include mime.types;同级处添加:server_tokens off;
- 删除所有
server{}或站点 conf 文件中重复写的server_tokens on/off(它们会干扰或被忽略,但可能引发误判) - 保存后执行:
nginx -t && nginx -s reload
若坚持“仅限某站点”,需用反向代理方式绕过
适用于该站点由独立后端(如 Node.js、Python Flask、Tomcat)提供服务,Nginx 仅作代理:
- 在对应
server块的location中启用代理,并主动屏蔽上游 Server 头:location / { proxy_pass http://backend; proxy_hide_header Server; # 移除后端返回的 Server 头 add_header Server "nginx"; # 可选:强制设为固定值(不含版本) } - 注意:
proxy_hide_header Server必须放在proxy_pass之后才生效;且此法不解决 Nginx 自身错误页(404/502)中的版本文字。
验证是否生效,两个地方缺一不可
-
响应头检查:
curl -I https://your-site.com
应只看到
Server: nginx或无Server字段(若被 CDN 覆盖)。 -
错误页检查:
访问一个不存在路径(如https://your-site.com/xxx),查看 HTML 源码,确认底部没有nginx/1.24.0等字样。
若仍有,需手动清理/usr/share/nginx/html/或宝塔的/www/server/nginx/html/下的404.html、50x.html中的版本文本。
补充说明:为什么不能单站关闭?
Nginx 官方设计上,server_tokens 是全局开关,属于 HTTP 协议层基础行为,不是虚拟主机特性。试图在 server{} 里写 server_tokens off,配置能通过语法检查,但重启或重载后不会改变任何输出——日志和实测均证实该设置被静默忽略。
所以,所谓“单站关闭”,本质是全局关闭 + 其他站点通过 CDN、前置负载均衡或自定义错误页来掩盖,而非 Nginx 原生支持。











