全域安全 header 必须配置在 apache 主配置文件全局作用域(如 httpd.conf 末尾或 conf.d/ 独立文件),启用 mod_headers 模块并使用 header always set;strict-transport-security 仅限全站 https 域名启用,x-frame-options 按资源类型条件化设置,x-content-type-options 始终设为 nosniff,x-xss-protection 设为 0,referrer-policy 推荐 strict-origin-when-cross-origin。

要在 Apache 中通过单一核心配置文件实现全域安全 Header 的统一化下发,关键在于位置正确、模块启用、指令可靠、逻辑严谨。不是写进去就生效,而是必须落在全局作用域、避开条件容器、绕过 .htaccess,并适配真实部署场景。
必须放在主配置文件的全局作用域
安全响应头要真正“全域”生效,不能嵌套在 <virtualhost></virtualhost> 内部,也不能放在 .htaccess 里。否则:
-
<virtualhost></virtualhost>内的配置只对该站点生效,多站点环境无法复用 - .htaccess 依赖
AllowOverride All,性能差,且无法控制重定向前的首次响应(如 HSTS 必须在 HTTPS 首响即发出)
正确做法:将安全头配置块直接写入 httpd.conf 文件末尾,或新建 /etc/httpd/conf.d/security-headers.conf 并通过 Include conf.d/security-headers.conf 加载。
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
确保 mod_headers 已启用并优先使用 Header always set
未启用模块会导致配置无效甚至 500 错误:
- 检查是否加载:
apachectl -M | grep headers,无输出则需启用(Debian/Ubuntu 运行a2enmod headers;RHEL/CentOS 取消httpd.conf中#LoadModule headers_module modules/mod_headers.so的注释) - Apache 2.4+ 推荐用
Header always set,而非Header set——前者确保响应无论由哪个模块生成(如 PHP、proxy、rewrite),头都能稳定写出
五个基础安全头的合理取值与启用前提
不是所有头都适合“一刀切”全局开启,需结合业务实际判断:
-
Strict-Transport-Security:仅对已全站启用 HTTPS 的域名启用,值为
max-age=31536000; includeSubDomains; preload;若误配到 HTTP 站点,浏览器会拒绝访问 -
X-Frame-Options:设为
DENY最简有效;若需兼容旧系统允许同源嵌套,可用SAMEORIGIN;注意它已被Content-Security-Policy: frame-ancestors取代,两者共存时后者优先 -
X-Content-Type-Options:始终设为
nosniff,无兼容性风险,强制禁用 MIME 嗅探 -
X-XSS-Protection:设为
0,显式关闭已废弃的 IE/旧 Chrome XSS Filter,避免误拦截导致页面白屏 -
Referrer-Policy:推荐
strict-origin-when-cross-origin,跨域请求只发送协议+主机名,兼顾隐私与功能
按资源类型做轻量级条件化控制
全域不等于“全文件一视同仁”。例如 HTML 页面需防点击劫持,而 PDF、API JSON 响应加 X-Frame-Options 反而可能干扰正常下载或调用:
- 用
<filesmatch></filesmatch>限定 HTML 类响应才加X-Frame-Options - 用
<locationmatch></locationmatch>对接口路径禁用X-Frame-Options,但保留Content-Security-Policy或Referrer-Policy - 静态资源(JS/CSS/图片)可额外加
Cache-Control,但不应混入 HSTS 或 CSP 等与执行上下文强相关的头










