hsts是浏览器端记忆指令,需在https虚拟主机中配置strict-transport-security响应头,配合http重定向与严格验证逐步升级策略。

HSTS不是跳转开关,而是浏览器端的“记忆指令”——它让浏览器在收到响应头后,自动把所有HTTP请求改写成HTTPS,连首次跳转都省了。关键在于配置正确、验证到位、节奏稳妥。
确认基础环境已就绪
Apache必须已启用HTTPS并安装mod_headers模块,否则HSTS头根本发不出去。
- 运行
apachectl -M | grep headers检查模块是否加载;若无输出,需在httpd.conf或apache2.conf中取消注释或添加:LoadModule headers_module modules/mod_headers.so - 确保站点已部署有效SSL证书,且443端口的
<virtualhost></virtualhost>配置正常工作 - 建议先用
curl -I https://yourdomain.com确认当前HTTPS响应能正常返回,再加HSTS
在HTTPS虚拟主机中添加HSTS响应头
只在<virtualhost></virtualhost>块内配置,绝不能放在HTTP(80端口)配置里——HSTS头只应在加密连接中发送。
- 添加这行指令(推荐起始值,安全可控):
Header always set Strict-Transport-Security "max-age=300; includeSubDomains" -
max-age=300表示仅缓存5分钟,便于快速验证和回滚 - 暂不加
preload参数,避免误提交预加载列表 - 如暂不覆盖子域名,可先去掉
includeSubDomains,后续确认全部子站HTTPS可用后再补上
配套做好HTTP到HTTPS重定向
HSTS管“后续访问”,而首次HTTP请求仍需服务端跳转兜底,否则用户直接输http://会失败。
- 在
<virtualhost></virtualhost>块中配置永久重定向:RewriteEngine On<br>RewriteCond %{HTTPS} off<br>RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] - 或更简洁写法:
Redirect permanent / https://yourdomain.com/(注意替换为实际域名) - 务必测试
http://yourdomain.com是否301跳转到HTTPS,且无循环或报错
验证生效并逐步升级策略
别跳过验证环节——很多配置看似正确,但因语法错误、模块未加载或位置放错而失效。
- 重启前执行
apachectl configtest检查配置语法 - 重启后用
curl -I https://yourdomain.com查看响应头,确认含:Strict-Transport-Security: max-age=300; includeSubDomains - 浏览器访问一次HTTPS后,在地址栏输入
http://yourdomain.com,应直接跳转(非服务端301,而是浏览器内部307),说明HSTS已生效 - 稳定运行数天无异常后,可逐步延长
max-age:300 → 86400(1天)→ 2592000(30天)→ 31536000(1年) - 确认全站及所有子域名HTTPS完全可用后,再考虑加入
preload并提交至hstspreload.org











