apache配置hsts等安全响应头须在443虚拟主机中设置,启用mod_headers和mod_ssl模块,使用header always set指令添加strict-transport-security等头,避免http主机配置、时间偏差及preload误用,并通过curl或浏览器工具验证生效。

为 Apache 的 SSL 配置添加安全响应头,核心是确保所有 HTTPS 响应都携带关键防护头,且只在 443 虚拟主机中设置——HTTP 主机里加了无效,还可能干扰调试。
先确认模块已启用并验证
Header 指令依赖 mod_headers,而 HSTS 还需 mod_ssl。缺一不可:
- Debian/Ubuntu:运行
a2enmod headers ssl && systemctl restart apache2 - RHEL/CentOS:检查
httpd.conf中LoadModule headers_module modules/mod_headers.so和LoadModule ssl_module modules/mod_ssl.so是否取消注释 - 统一验证命令:
apachectl -M | grep -E "(headers|ssl)",输出含headers_module和ssl_module才算就绪
在 HTTPS 虚拟主机中添加关键头
所有安全头必须写在 <virtualhost></virtualhost> 块内,不能放在全局或 HTTP 主机里:
-
HSTS(强制 HTTPS):
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"(preload仅在全站及子域长期稳定 HTTPS 后启用) -
防 MIME 嗅探:
Header always set X-Content-Type-Options "nosniff"(用always set确保 404、500 等错误页也生效) -
防点击劫持:优先用 CSP:
Header always set Content-Security-Policy "frame-ancestors 'self';"(不要和X-Frame-Options共存,后者会被忽略) -
XSS 基础防护:
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self';"(禁内联脚本、插件,比X-XSS-Protection更可靠)
避免常见错误
这些细节错一个,就可能让头失效或锁死访问:
- 别在 HTTP 主机里配 HSTS 或
Secure类头——浏览器直接无视 - 测试阶段先用短
max-age=300验证,再调高,避免误配导致全站无法通过 HTTP 访问 - 确保服务器时间准确,偏差超过
max-age会导致浏览器拒绝接受 HSTS - 首次访问必须走 HTTPS;如果没配 301 重定向,用户从 HTTP 进来,HSTS 头根本发不出去
验证是否生效
配置重启后,别只看文件,要实测:
- 终端执行:
curl -I https://yourdomain.com,检查响应头是否包含全部设置项 - Chrome DevTools → Network → 刷新页面 → 查看 Headers 标签下的 Response Headers
- HSTS 可访问
chrome://net-internals/#hsts查询记录,或提交至 hstspreload.org 做格式校验











