apache mod_headers 配置安全响应头需启用模块、用 header always set 覆盖所有状态码,并按业务定制 csp 等策略,避免堆砌模板导致功能异常。

Apache 的 mod_headers 是注入安全响应头的核心模块,配置本身不难,但失效常因模块未启用、作用域错位或指令写法不当。关键在于每条头都覆盖全部响应状态(含 404/500),且策略需匹配实际业务,而非堆砌通用模板。
先确认 mod_headers 已真正启用
Header 指令不会自动生效——模块没加载,所有配置都是无效的。
- Debian/Ubuntu:运行 sudo a2enmod headers && sudo systemctl restart apache2
- RHEL/CentOS/XAMPP:检查 httpd.conf 中是否取消注释这一行:LoadModule headers_module modules/mod_headers.so(Windows 下为 .dll)
- 验证命令:apachectl -M | grep headers,输出含 headers_module (shared) 才算成功
必须用 Header always set,别只用 Header set
Header set 只作用于 2xx 成功响应;而攻击者常利用错误页(如 404 页面含用户输入)发起反射型 XSS。只有 always set 能确保所有状态码都携带安全头。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Header always set X-Content-Type-Options "nosniff"
- Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self';"
- Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"(仅 HTTPS 虚拟主机中配置)
防点击劫持:优先用 CSP frame-ancestors,不用 X-Frame-Options
X-Frame-Options 已被现代浏览器逐步弃用(ALLOW-FROM 在 Chrome 79+ 失效),frame-ancestors 更灵活且标准统一。
- 只允许同站嵌入:Header always set Content-Security-Policy "frame-ancestors 'self';"
- 允许多个可信域名:Header always set Content-Security-Policy "frame-ancestors 'self' https://admin.example.com https://app.trusted.net;"
- 禁止任何嵌入:frame-ancestors 'none'
- 切勿同时配置 X-Frame-Options 和 frame-ancestors——后者会完全忽略前者
CSP 策略要适配真实资源,避免白屏
直接套用 default-src 'self' 很容易导致字体、统计脚本、CDN 图片等加载失败,页面功能异常。
- Google Fonts?加 style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com
- 含内联 JS(如 WordPress 主题)?临时允许:script-src 'self' 'unsafe-inline',后续应迁移到 nonce 或 hash
- 使用 AJAX 请求第三方 API?明确添加 connect-src 'self' https://api.example.com
- 开发阶段可加 report-uri /csp-report,但需确保该路径支持 POST(如配置
Require all granted )










