apache开启hsts需先启用mod_ssl和mod_headers模块,仅在https虚拟主机中配置header always set strict-transport-security,推荐值为"max-age=31536000; includesubdomains; preload",但includesubdomains和preload须确保全站及子域长期稳定https。

要在 Apache 中开启 HSTS 策略,让浏览器自动且强制使用 HTTPS 访问你的网站,关键不是加一行头就完事,而是确保整个链路安全、配置合规、生效可验。HSTS 本身不替代 HTTPS 跳转,而是补上首次 HTTP 请求的防护缺口。
确认基础模块已启用
Apache 必须加载两个核心模块才能发送 HSTS 响应头:
- mod_ssl:提供 HTTPS 支持,确保虚拟主机监听 443 端口并正确配置证书
- mod_headers:用于设置 Strict-Transport-Security 响应头
在 Debian/Ubuntu 系统中运行:
a2enmod ssl headers && systemctl restart apache2
在 CentOS/RHEL 中检查 httpd.conf,确认以下两行未被注释:
LoadModule ssl_module modules/mod_ssl.so
LoadModule headers_module modules/mod_headers.so
仅在 HTTPS 虚拟主机中配置 HSTS 头
HSTS 只对 HTTPS 响应生效,绝不能写在 HTTP(80端口)的 VirtualHost 里。在你的 SSL 虚拟主机块内添加:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
说明:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- max-age=31536000 表示一年有效期,是进入预加载列表的最低要求(至少 10886400 秒),新部署建议先用 max-age=300 测试 5 分钟,验证无误再调高
- includeSubDomains 要求所有子域名(如 api.example.com、blog.example.com)也必须支持 HTTPS,否则会导致子域无法访问
- preload 是提交到浏览器内置 HSTS 列表的前提,启用前务必确认全站及所有子域长期稳定支持 HTTPS
配合 HTTP → HTTPS 的 301 重定向
HSTS 不会帮你把 HTTP 请求变 HTTPS——它只在浏览器收到 HSTS 头后,才对后续访问自动改写协议。所以仍需保留 HTTP 虚拟主机的跳转规则:
<virtualhost><br> ServerName example.com<br> Redirect permanent / https://example.com/<br></virtualhost>
注意:不要在 HTTP 主机里加 Header 指令,无效且可能干扰调试。
验证是否真正生效
配置重启后,必须实测响应头,不能只看配置文件:
- 命令行检查:curl -I https://example.com,确认输出中含 Strict-Transport-Security 字段
- 浏览器打开 DevTools → Network → 刷新页面 → 查看响应头
- 提交前用 https://hstspreload.org 检测格式、重定向链、子域覆盖等是否符合预加载要求
- 本地测试时可访问 chrome://net-internals/#hsts 手动查询或删除缓存策略
服务器时间必须准确,偏差超过 max-age 会导致浏览器拒绝接受该策略。










