如何隐藏 Apache 版本信息 ServerTokens 防止被扫描攻击

文章导读
隐藏 Apache 版本信息最直接的做法是修改主配置文件,将 ServerTokens 设为 Prod 并关闭 ServerSignature,若需彻底移除 Server 头还需配合 mod_headers 模块。
📋 目录
  1. 操作前准备:配置备份
  2. 命令速用版
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑与风险提示
  6. 参考来源
A A

隐藏 Apache 版本信息最直接的做法是修改主配置文件,将 ServerTokens 设为 Prod 并关闭 ServerSignature,若需彻底移除 Server 头还需配合 mod_headers 模块。

先说结论:仅改 ServerTokens 不够,必须全局配置并配合 headers 模块才能彻底隐藏,且改完必须用 curl 验证。

  • 先判断:确认当前响应头是否泄露版本号及操作系统信息
  • 优先做:修改前备份配置,在主配置文件设置 ServerTokens Prod 和 ServerSignature Off
  • 再验证:使用 curl 命令检查正常页面与 404 页面的响应头及内容

操作前准备:配置备份

修改任何核心配置前,务必备份原文件以便出错时快速回滚:

sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.bak_$(date +%F)
# CentOS/RHEL 路径通常为:
sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak_$(date +%F)

命令速用版

以下是核心配置片段,需放入主配置文件(如 httpd.conf 或 apache2.conf):

ServerTokens Prod
ServerSignature Off

<IfModule mod_headers.c>
    Header unset Server
</IfModule>

修改后重启服务:

sudo systemctl restart apache2
# 或
sudo systemctl restart httpd

分步处理

1. 找到主配置文件。Linux 系统通常位于/etc/apache2/apache2.conf 或/etc/httpd/conf/httpd.conf,XAMPP 环境可能在 httpd-default.conf 中被引用。

2. 启用 mod_headers 模块。不同发行版处理方式不同:

如何隐藏 Apache 版本信息 ServerTokens 防止被扫描攻击
  • Debian/Ubuntu:使用工具启用,无需手动指定路径。
    sudo a2enmod headers
  • CentOS/RHEL:通常默认加载,检查 httpd.conf 中以下行未被注释:
    LoadModule headers_module modules/mod_headers.so

3. 修改核心指令。确保以下两行存在且未被注释:

ServerTokens Prod
ServerSignature Off

4. 配置移除 Server 头。注意该指令不能写在<Directory>块内,需在全局或<VirtualHost>中:

<IfModule mod_headers.c>
    Header unset Server
</IfModule>

5. 处理 PHP 泄露。检查 php.ini,设置 expose_php = Off,防止返回 X-Powered-By 头。

6. 重启 Apache 服务使配置生效。

怎么验证是否生效

不要只看浏览器,必须用命令行工具验证:

如何隐藏 Apache 版本信息 ServerTokens 防止被扫描攻击

1. 检查正常页面响应头:

curl -I http://your-domain.com

确认 Server 字段不包含版本号,或已被移除。

2. 检查错误页面:

curl -I http://your-domain.com/nonexistent

确认 404 页面 HTML 源码底部没有服务器签名信息。

3. 检查 HTTPS 配置:如果有 SSL 虚拟主机,需确保相同配置已同步应用。

常见坑与风险提示

1. 配置作用域错误:ServerTokens 只能在全局作用域生效,在<VirtualHost>块内设置无效。

如何隐藏 Apache 版本信息 ServerTokens 防止被扫描攻击

2. 配置文件路径陷阱:XAMPP 或 phpEnv 等集成环境的主配置可能被 Include 到其他文件,需搜索确认实际生效的文件路径。

3. 模块未启用:mod_headers 默认可能未加载,导致 Header unset 指令无效。

4. 代理层覆盖:若前端有 Nginx 反向代理或 CDN,它们可能重新注入 Server 头,需在代理层统一处理。

5. 旧版本兼容性:部分旧版 Apache 对 Header unset 支持不稳定,可尝试 Header set Server "" 替代。

6. 监控与 WAF 影响:移除 Server 头可能导致依赖该字段的监控系统的识别功能失效,或部分 WAF 策略无法匹配,请评估业务影响。

参考来源