apache全站hsts需先启用mod_ssl和mod_headers模块,仅在https虚拟主机中配置strict-transport-security头,配合http 301跳转,并经测试验证后逐步延长max-age至1年。

在 Apache 中配置全站 HSTS,核心是让浏览器记住“只走 HTTPS”,但不是加一行头就完事——它依赖 HTTPS 稳定、配置位置准确、验证及时,且必须分步推进。
确保基础条件全部满足
Apache 必须同时加载两个模块:mod_ssl(提供 HTTPS 支持)和 mod_headers(用于注入响应头)。缺一不可。
- Debian/Ubuntu 系统执行:sudo a2enmod ssl headers && sudo systemctl restart apache2
- RHEL/CentOS 检查 httpd.conf,确认这两行未被注释:
LoadModule ssl_module modules/mod_ssl.so
LoadModule headers_module modules/mod_headers.so - 用命令验证:apachectl -M | grep -E "(ssl|headers)",应看到两模块均 listed
- 站点必须已部署有效 SSL 证书,443 端口的 VirtualHost 能正常返回 HTTPS 响应(先 curl -I https://yourdomain.com 确认能通)
只在 HTTPS 虚拟主机中添加 HSTS 头
HSTS 响应头只能通过加密连接发送,写在 HTTP(:80)配置里完全无效,还可能干扰调试。
- 打开你的 SSL 虚拟主机配置(如 /etc/apache2/sites-available/your-ssl-site.conf)
- 在
块内添加这一行:
Header always set Strict-Transport-Security "max-age=300; includeSubDomains" - 首次上线务必用短周期测试:max-age=300(5 分钟),便于快速验证和回滚
- 暂不加 preload —— 它意味着申请加入浏览器内置列表,提交后无法立即撤回
配套做好 HTTP 到 HTTPS 的永久跳转
HSTS 不处理第一次访问。用户如果手动输 http:// 或点击 HTTP 链接,仍需服务端兜底跳转,否则直接失败。
- 在
块中配置 301 重定向:
Redirect permanent / https://yourdomain.com/(替换为你的实际域名) - 确保该配置生效后,访问 http://yourdomain.com 会返回 301 并跳转到 HTTPS 地址
- 不要在 :80 主机里加任何 Header 指令 —— 浏览器会忽略,且无意义
验证生效并逐步升级策略
配置重启后必须实测,不能只看文件是否保存成功。
- 执行:curl -I https://yourdomain.com,输出中应明确包含:
Strict-Transport-Security: max-age=300; includeSubDomains - 浏览器访问一次 HTTPS 后,在地址栏输入 http://yourdomain.com —— 若直接跳转(地址栏瞬间变 HTTPS,Network 中看不到 301,而是 307 Internal Redirect),说明 HSTS 已被浏览器接受
- 稳定运行 2–3 天无异常,再逐步延长 max-age:
300 → 86400(1天)→ 2592000(30天)→ 最终设为 31536000(1年) - 确认所有子域名(如 api.yourdomain.com、shop.yourdomain.com)均已支持 HTTPS 后,才启用 includeSubDomains;确认长期稳定后,再考虑 preload 并提交至 hstspreload.org











