HSTS本质是浏览器端强制HTTPS访问机制,不替代HTTP重定向,仅在HTTPS虚拟主机中通过Header指令配置;需先确保SSL证书有效、mod_ssl与mod_headers已启用,并验证HTTPS响应正常后方可添加。
在 Apache 中配置 HSTS,本质是让浏览器“记住”只用 HTTPS 访问你的域名,而不是靠服务端跳转。它不替代 HTTP 重定向,而是补上首次跳转后的安全缺口——一旦生效,连你在地址栏输 http:// 都会自动变成 https://。
三件事缺一不可,否则 HSTS 头根本发不出去:
443 端口的 HTTPS 虚拟主机能正常响应mod_ssl 和 mod_headers 模块:运行 apachectl -M | grep -E "(ssl|headers)",应看到两行输出;若无,需在主配置中取消注释或添加:LoadModule ssl_module modules/mod_ssl.soLoadModule headers_module modules/mod_headers.so
curl -I https://yourdomain.com 确认 HTTPS 响应能返回,再加 HSTSHSTS 只对加密连接生效,必须写在 <VirtualHost *:443> 块内,绝不能 放在 80 端口配置里:
Header always set Strict-Transport-Security "max-age=300; includeSubDomains"
max-age=300 表示仅缓存 5 分钟,适合上线初期测试HSTS 不管第一次访问,所以 80 端口仍需兜底跳转:
<VirtualHost *:80> 块中添加:Redirect permanent / https://yourdomain.com/(替换为实际域名)http://yourdomain.com 应返回 301 Moved Permanently 并跳转到 HTTPSHeader 指令,无效且干扰调试重启前执行 apachectl configtest 检查语法;重启后务必实测:
curl -I https://yourdomain.com,确认响应头含:Strict-Transport-Security: max-age=300; includeSubDomains
http://yourdomain.com,若直接跳转(开发者工具 Network 中显示 307 Internal Redirect),说明 HSTS 已被浏览器接收并启用max-age:300 → 86400 → 2592000 → 31536000(1年)