ServerName 是路由开关,不直接生成响应头,但决定哪个VirtualHost块生效;安全响应头必须写在对应VirtualHost块内,配合Header always set等指令启用mod_headers后精准作用于该站点。

ServerName 本身不生成或控制响应头,但它决定了哪个虚拟主机配置块生效——而安全响应头必须写在对应的 <VirtualHost> 块里,才能精准作用于该站点。换句话说,ServerName 是“路由开关”,安全头是“防护装备”,两者配合的关键在于:把头指令放在正确的虚拟主机上下文中。
把安全头写进 VirtualHost 块内
不要在主配置(httpd.conf)全局加,也不要在 .htaccess 里设。直接在你为某个域名配置的 <VirtualHost *:443> 或 <VirtualHost *:80> 块中添加,紧贴 ServerName 和 DocumentRoot 下方即可:
- 确保已启用 mod_headers 模块(
a2enmod headers或取消 httpd.conf 中对应 LoadModule 行注释) - 用
Header always set,保证 404、500、301 等所有响应都带安全头 - 推荐包裹在
<IfModule mod_headers.c>中,避免模块未启用时报错
常见安全头示例(按站点实际需求调整)
以下可直接复制到你的 VirtualHost 块中:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
Header always set X-Content-Type-Options "nosniff"—— 阻止 MIME 类型猜测 -
Header always set X-Frame-Options "DENY"—— 禁止页面被嵌入 iframe -
Header always set Referrer-Policy "strict-origin-when-cross-origin"—— 控制 Referer 发送精度 - HTTPS 站点加上:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" - 如需兼容旧浏览器,可加:
Header always set X-XSS-Protection "1; mode=block"
注意 ServerName 对安全头的间接影响
一个清晰、唯一的 ServerName 能确保请求准确落入目标虚拟主机,避免因匹配失败导致安全头没加载:
- 每个
<VirtualHost>必须有明确的ServerName(如api.example.com),不能留空或用通配符 - 若同时配置 HTTP 和 HTTPS,两个虚拟主机都要各自声明 ServerName,且端口与 Listen 一致
- 别名用
ServerAlias补充,但主域名必须唯一,否则 Apache 可能 fallback 到默认虚拟主机,绕过你精心配置的安全头
额外加固:隐藏服务器指纹
ServerName 不影响 Server 响应头,但你可以配合主配置做进一步收敛:
- 在 httpd.conf 主配置中设置:
ServerTokens Prod和ServerSignature Off - 再在 VirtualHost 块中加:
Header unset Server(Apache ≥ 2.4.29)或Header set Server ""(旧版) - 注意:CDN 或反向代理可能覆盖这些设置,需同步清理其响应头

















