如何通过HSTS Preload部署实现域名全站HTTPS强制开启的最佳实践?
- 内容介绍
- 文章标签
- 相关推荐
本文共计861个文字,预计阅读时间需要4分钟。
在HTTPS的server块中添加HSTS头,并提交到浏览器的preload列表(preload list),才能真正实现底层强制HTTPS——这不是依赖服务端跳转,而是浏览器主动拦截所有HTTP请求。这一步必须建立在稳定、全覆盖的HTTPS基础上,否则用户将无法访问。
HTTP 跳转与 HSTS 必须分离配置
80 端口的 server 块只做一件事:用 return 301 https://$host$request_uri; 完成一次性重定向。不要在这里加任何 HSTS 头,也不要把跳转逻辑混进 443 的 server 块里。原因很实际:
- HTTP 响应中发 HSTS 头无效,浏览器直接忽略
- 若把
return写在 HTTPS 的 location 里,可能因匹配顺序或缓存规则被绕过 - 使用
$host而非$http_host,可防 Host 头注入攻击 - 建议配合
underscores_in_headers off;和明确的server_name example.com www.example.com;白名单
HSTS 响应头必须稳定出现在所有 HTTPS 响应中
只在首页或主页面加 HSTS 是不够的。它需要在每次 HTTPS 响应(包括 404、500、304)中都存在,否则策略可能中断。
本文共计861个文字,预计阅读时间需要4分钟。
在HTTPS的server块中添加HSTS头,并提交到浏览器的preload列表(preload list),才能真正实现底层强制HTTPS——这不是依赖服务端跳转,而是浏览器主动拦截所有HTTP请求。这一步必须建立在稳定、全覆盖的HTTPS基础上,否则用户将无法访问。
HTTP 跳转与 HSTS 必须分离配置
80 端口的 server 块只做一件事:用 return 301 https://$host$request_uri; 完成一次性重定向。不要在这里加任何 HSTS 头,也不要把跳转逻辑混进 443 的 server 块里。原因很实际:
- HTTP 响应中发 HSTS 头无效,浏览器直接忽略
- 若把
return写在 HTTPS 的 location 里,可能因匹配顺序或缓存规则被绕过 - 使用
$host而非$http_host,可防 Host 头注入攻击 - 建议配合
underscores_in_headers off;和明确的server_name example.com www.example.com;白名单
HSTS 响应头必须稳定出现在所有 HTTPS 响应中
只在首页或主页面加 HSTS 是不够的。它需要在每次 HTTPS 响应(包括 404、500、304)中都存在,否则策略可能中断。

