servertokens prod仅缩略server头为“apache”,无法删除该头,且对404/500等错误响应无效;必须启用mod_headers并配置header always unset server才能彻底移除。

必须用 Header unset Server,ServerTokens Prod 只能缩略、不能删除,且对 404 等错误响应头无效。
为什么 ServerTokens Prod 不够用
它只把 Server: Apache/2.4.41 (Ubuntu) 缩成 Server: Apache,但头依然存在;扫描器(比如 curl -I http://x.x.x.x)一眼就能识别出是 Apache;更关键的是,这个指令对 404、500 等错误响应头不起作用——错误页的响应头里 Server 还是原样暴露。
常见误操作包括:
- 只改了主配置却忘了 SSL 虚拟主机块,HTTPS 请求仍泄露
- 把
ServerSignature Off当成万能药,但它只删错误页 HTML 底部文字,不影响 HTTP 响应头 - 在
<directory></directory>块里写Header unset Server,结果完全不生效(该指令不支持目录级作用域)
正确启用 mod_headers 并删除 Server 头
先确认模块已加载:
- Debian/Ubuntu:
a2enmod headers+systemctl restart apache2 - RHEL/CentOS:
LoadModule headers_module modules/mod_headers.so在httpd.conf中启用
然后在 <virtualhost></virtualhost> 或全局配置(如 /etc/apache2/apache2.conf)中添加:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<ifmodule mod_headers.c>
Header always unset Server
</ifmodule>
注意两点:
- 用
always修饰符,确保它覆盖所有响应阶段(包括错误响应),否则 404 时可能失效 - 不要写成
Header unset Server(无always),某些 Apache 2.4.x 版本(如 2.4.29 之前)对此支持不稳定
批量清理其他敏感头:别指望通配符
Header unset 不支持正则或通配符,每个头都得单独写一行:
<ifmodule mod_headers.c>
Header always unset Server
Header always unset X-Powered-By
Header always unset X-AspNet-Version
Header always unset X-Generator
Header always unset ETag
</ifmodule>
容易踩的坑:
-
ETag由mod_etag模块生成,如果没关掉该模块,Header unset ETag可能被后续处理覆盖 -
X-Powered-By若来自 PHP,仅靠 Apache 层删除不够——PHP 本身也会重设,需同时在php.ini中设expose_php = Off - 用了 CDN 或 Nginx 前置代理时,Apache 的
Header unset对最终返回给用户的响应无效,必须在 CDN 或 Nginx 层再做一遍
验证是否真删干净了
别信配置文件,要信真实响应:
- 测三类请求:
curl -I http://yoursite.com(正常路径)、curl -I http://yoursite.com/404test(404)、curl -I https://yoursite.com(HTTPS) - 加
-H "Cache-Control: no-cache"避免中间缓存干扰:curl -I -H "Cache-Control: no-cache" https://yoursite.com - 浏览器开发者工具里看 Network → Response Headers,点开「Actual response」,不是预检或重定向的响应
最常被忽略的一点:Apache 配置生效后,如果上游有反向代理(比如 Nginx 或 Cloudflare),它可能自己又加回 Server 头——这时你得去查那个代理的日志和配置,而不是反复调 Apache。









