隐藏 Server 响应头是基础但关键的安全措施,因 Apache 默认暴露版本和系统信息,便于攻击者匹配漏洞;需先配置 ServerTokens Prod 和 ServerSignature Off,再用 mod_headers 的 Header unset Server 彻底移除,同时处理 PHP 的 expose_php、应用框架及 CDN 可能注入的标识头。

为什么隐藏 Server 响应头是基础但关键的一步
Apache 默认会在每个 HTTP 响应头中暴露 Server: Apache/2.4.52 (Ubuntu) 这类信息,攻击者可据此精准匹配已知漏洞版本或操作系统特性。这不是“防黑客”,而是消除扫描器自动识别的显性线索——只要没关掉,nmap -sV 或 whatweb 一扫就出结果。
实操上只需两步,但顺序不能错:
- 编辑
/etc/apache2/mods-available/security2.conf(或security.conf,取决于是否启用 mod_security)或主配置文件(如/etc/apache2/apache2.conf),确保包含:ServerTokens Prod<br>ServerSignature Off
- 重启服务:
sudo systemctl restart apache2
ServerTokens Prod 让响应头只保留 Apache,不带版本和系统;ServerSignature Off 则禁用错误页面底部的服务器信息。注意:这两项必须在启用 mod_headers 前生效,否则后续自定义头可能被覆盖。
用 mod_headers 彻底移除或伪造 Server 头
仅靠 ServerTokens Prod 仍会返回 Server: Apache,对高级扫描器(如 curl -I http://x.x.x.x)依然可见。真正隐藏需用 mod_headers 模块主动删除或替换该头。
确认模块已启用:a2enmod headers,然后在虚拟主机配置或全局配置中添加:
<ifmodule mod_headers.c><br> Header unset Server<br></ifmodule>
或者更稳妥地设为空字符串(部分旧版 Apache 对 unset 支持不稳定):
Header set Server ""
注意:Header unset Server 在某些 Apache 版本(如 2.4.29+)才完全生效;若测试后仍见 Server 头,检查是否被其他模块(如 mod_proxy 或反向代理层)重新注入——此时得在代理层(如 Nginx)统一处理。
检查是否真被隐藏:别信配置,要信 curl
改完配置不验证等于没改。直接用 curl -I 测试,重点看三处:
- 正常请求:
curl -I http://your-domain.com→ 确认响应头无Server:行 - 404 页面:
curl -I http://your-domain.com/nonexistent→ 防止错误页泄露信息 - HTTPS 请求(如有):
curl -I https://your-domain.com→ 确保 SSL 虚拟主机也应用了相同配置
常见翻车点:ServerSignature Off 只影响错误页 HTML 内容,不影响响应头;而 Header unset Server 若写在 块里则无效,必须放在 或全局作用域。
额外风险点:PHP、应用框架可能自己加 Server 或 X-Powered-By
Apache 配置再干净,PHP 也会默认输出 X-Powered-By: PHP/8.1.2,Laravel、WordPress 插件甚至自定义中间件也可能塞入标识头。这等于前门锁了,后窗大开。
PHP 层面需修改 /etc/php/*/apache2/php.ini:
expose_php = Off
对于应用层,检查:
- PHP-FPM 的
fastcgi_param SERVER_SOFTWARE是否被透传 - 是否在代码中调用
header('Server: ...')或类似逻辑 - CDN 或负载均衡器(如 Cloudflare、ALB)是否回填了原始
Server头
最可靠的方式是在 Apache 最外层统一清理:
Header unset X-Powered-By<br>Header unset X-Generator
——这些头比 Server 更常被忽略,却同样暴露技术栈细节。










