server头泄露版本与端口无关,根本原因是未正确配置servertokens指令;需在全局、各virtualhost及ssl配置(如httpd-ssl.conf)中统一设为prod,并逐端口验证响应头与404页面。

为什么改了端口 Server 头还在泄露版本
改完 Listen 和 ServerName 后,curl -I 依然看到 Server: Apache/2.4.52 (Win64) OpenSSL/1.1.1m PHP/8.1.0 ——这不是端口问题,是 ServerTokens 没关。Apache 的响应头版本信息由 ServerTokens 控制,和监听端口完全无关。哪怕你把端口改成 9999,只要没设 ServerTokens Prod,它照旧吐完整字符串。
多端口配置下 ServerTokens 容易被覆盖的三个位置
当你为不同端口配了多个 <virtualhost></virtualhost>(比如 :8080、:8081),ServerTokens 很可能在某处被重写:
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
-
httpd.conf全局设了ServerTokens Prod,但某个<virtualhost></virtualhost>块里又写了ServerTokens Full,后者会生效 -
httpd-vhosts.conf里每个<virtualhost></virtualhost>都没写ServerTokens,但 Apache 默认值是Full,所以全部回退到默认 - 用 XAMPP 控制面板的 Config → Apache (httpd.conf) 打开文件修改,结果编辑的是缓存副本,真实
httpd.conf没变
验证多端口站点是否真关掉了 Server 信息
不能只测一个端口。每个监听端口都要单独验证:
- 对每个端口发请求:
curl -I http://localhost:8080、curl -I http://localhost:8081,检查响应头里Server:字段是否只剩Apache - 访问每个端口的 404 页面(如
http://localhost:8081/xxx),确认 HTML 底部没有 Apache 版本字样 - 运行
httpd.exe -t(Windows)或httpd -t(Linux/macOS)确保语法无误——拼错ServerTokens会导致 Apache 启动失败,但错误日志里只报“Syntax error”,不提示哪行
最常被忽略的细节:SSL 端口也要单独处理
如果同时开了 HTTPS(比如把 443 改成 8443),ServerTokens 必须在 httpd-ssl.conf 里再设一次。因为 SSL 虚拟主机是独立加载的,它不继承主配置里的 ServerTokens。漏掉这一步,curl -I https://localhost:8443 仍会暴露完整版本号。而且注意:httpd-ssl.conf 里默认没有 ServerTokens 行,得手动加,不能只靠全局配置。










