server_tokens off必须置于http块内才全局生效,写在server或location块中无效;需修改宝塔主配置文件/nginx.conf的http段,重载配置后用curl直连IP验证响应头是否仅显示“Server: nginx”。
server_tokens off 必须写在 http 块里,不是 server 或 location
很多人改了但没生效,核心原因就是位置错了。
放在某个站点的
块里,看似合理,但 Nginx 实际只认
块级的设置——子块不声明时才继承,一声明就覆盖。宝塔默认的主配置
里,
是最外层作用域,这里加才真正全局生效。
实操建议:
打开
,找到
开头的位置,在它后面紧跟着加一行:
删掉其他地方(比如站点配置文件、
块内)重复写的
行,避免冲突
别漏分号,Nginx 语法校验会失败;也别加引号或等号写成
,这是错的
改完必须「重载配置」,不是重启、也不是只点保存
宝塔界面上有好几个按钮容易混淆:
只写入文件,
会中断连接,
按钮在老版本里可能不存在。唯一正确动作是点击右上角的
(图标是两个循环箭头),它等价于执行
,平滑加载新配置且不丢请求。
验证是否真生效:
用
直连(绕过 CDN 和域名解析),看响应头有没有
这类字段
如果还显示版本号,立刻检查:
看语法是否报错;
查有没有别的地方又写成了
别依赖浏览器开发者工具 Network 面板——CDN 或反向代理可能缓存旧头
关了 server_tokens 还不够:PHP、错误页、欢迎页全得动
只管 HTTP 响应头里的
字段,其他地方照样泄露版本。扫描器 curl 一个不存在路径(比如
)就能拿到完整指纹。
Nginx
在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
下载
必须同步处理:
PHP 的
:进宝塔 → 软件管理 → PHP → 设置 → 配置修改,在
里搜
,改成
,然后点
默认 50x 错误页含
nginx
版本文字:替换
,删掉所有
相关字符串,再执行
访问服务器 IP 时返回的默认欢迎页:在站点配置的
块里加
,或者指向一个空 HTML,否则直接暴露
宝塔面板
自己也在发版本号,X-Powered-By 得手动干掉
很多人测完响应头干净了就以为完事,结果用
一扫,发现还有
。这不是 Nginx 配置能控制的,是宝塔后端 Python 代码硬写的。
关键两处要改:
HTTP 头:编辑
,搜索
,把整行注释掉(前面加
)
登录页 DOM:打开
,删掉含
或
的 HTML 标签
每次宝塔升级都会覆盖这两个文件,务必提前备份,升级后重新处理
这些改动没法一劳永逸,
是起点,不是终点。真正的难点在于各层服务(Nginx、PHP、宝塔自身、甚至 Linux 登录横幅)都可能独立输出版本信息,漏掉任意一层,指纹就还在。
server_tokens offserverhttp/www/server/nginx/conf/nginx.confhttp { }/www/server/nginx/conf/nginx.confhttp {server_tokens off;serverserver_tokensserver_tokens = off保存重启 Nginx重载 Nginx重载配置nginx -s reloadcurl -I http://你的服务器IPServer: nginx/1.24.0nginx -tgrep -r "server_tokens" /www/server/nginx/conf/onserver_tokens offServer/nonexistentexpose_php = Offphp.iniexpose_phpOff重启PHP/www/server/nginx/html/50x.htmlnginx/nginx -t && nginx -s reloadlocation /return 444;nginx/1.24.0curl -IX-Powered-By: 宝塔-8.0.5/www/server/panel/class/webserver.pyset_header("X-Powered-By"#/www/server/panel/BTPanel/templates/default/login.html{{version}}panelVersionserver_tokens