HSTS必须在HTTPS虚拟主机中配置且依赖有效SSL证书、启用headers_module、配合301重定向使用;max-age需从300秒逐步延长,includeSubDomains和preload须全站HTTPS稳定后谨慎启用。
apache 中配置 hsts,核心是让浏览器记住“只走 https”,但这个记忆必须由一次有效的 https 响应触发。它不是跳转指令,不能替代 301 重定向,而是和重定向配合使用的安全加固手段。
前提条件必须全部满足
如果以下任一条件不成立,HSTS 头即使加了,浏览器也会直接忽略:
- SSL/TLS 证书已正确部署:必须是受信 CA 签发、未过期、域名完全匹配(比如访问 example.com,证书就不能只覆盖 www.example.com)
- 443 端口 HTTPS 服务正常:能返回 2xx 页面(不只是首页或 301),且响应完整(无混合内容、无证书警告)
- headers_module 已启用:执行 a2enmod headers(Debian/Ubuntu)或确认 LoadModule headers_module 在 httpd.conf 中已取消注释
只在 HTTPS 虚拟主机中配置,禁止写在 HTTP 块里
HSTS 只对 HTTPS 响应生效,写在 :80 的 <virtualhost></virtualhost> 里完全无效。正确位置是启用 SSL 的 :443 块内:
<virtualhost>
ServerName example.com
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/privkey.pem
# … 其他 SSL 配置
<pre class="brush:php;toolbar:false;"># ✅ 正确:HSTS 头只放在这里
Header always set Strict-Transport-Security "max-age=300; includeSubDomains"
注意:不要在 :80 的块中添加 HSTS;也不要使用 Header set(不带 always),否则 404、500 等非 200 响应将不携带该头。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
参数设置要分阶段上线,切忌一步到位
max-age 过长或过早启用 preload,一旦出错几乎无法回滚:
- 首次上线用 max-age=300(5 分钟),用
curl -I https://example.com确认响应头出现且值正确 - 观察 1–2 天无异常后,逐步延长:86400(1 天)→ 2592000(30 天)→ 15768000(6 个月)→ 最终到 31536000(1 年)
- includeSubDomains 必须等所有子域(如 api.example.com、cdn.example.com)都稳定支持 HTTPS 后再开启
- preload 是高危操作:提交前需满足 hstspreload.org 全部硬性要求(全站 HTTPS 重定向、max-age ≥ 31536000、所有子域有效证书),一旦收录,用户半年内无法通过 HTTP 访问
验证是否真正生效
不能只看响应头有没有——要看浏览器是否“记住了”:
- Chrome 中访问 chrome://net-internals/#hsts,输入域名查是否已缓存;可点击 Delete domain security policies 清除本地测试
- 用隐身窗口访问 http://example.com,观察是否自动跳转到 HTTPS(注意:若域名已被预载,Chrome 会直接拦截 HTTP 请求,不发包,此时看不到跳转过程)
- 检查反向代理(如 Nginx、CDN)是否覆盖了响应头——若用了代理,HSTS 头也需在代理层显式配置










