Nginx网关层启用HSTS需在HTTPS server块中配置add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always,确保全站HTTPS、子域证书有效,并经灰度验证后方可提交预加载。

在Nginx网关层启用HSTS(HTTP Strict Transport Security)是强制浏览器仅通过HTTPS访问站点的关键手段,能有效防御SSL剥离、中间人劫持等攻击。配置本身不复杂,但需注意生效范围、预加载适配和回退风险。
一、HSTS核心配置项说明
HSTS通过响应头 Strict-Transport-Security 告知浏览器:未来一段时间内,对该域名的所有请求必须走HTTPS。Nginx中通过 add_header 指令设置,关键参数包括:
-
max-age:以秒为单位,表示HSTS策略有效期(如
31536000表示1年) - includeSubDomains:可选,启用后子域名也强制HTTPS(如 api.example.com、www.example.com)
- preload:可选,声明该站点有意加入浏览器HSTS预加载列表(需后续手动提交)
二、Nginx网关层标准配置方式
推荐在处理HTTPS请求的 server 块中添加,避免HTTP响应中误发HSTS头(浏览器会忽略):
server {
listen 443 ssl http2;
server_name example.com;
<pre class="brush:php;toolbar:false;"># 其他SSL及业务配置...
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;}
注意:务必加上 always 参数,否则Nginx默认只对2xx/3xx响应添加头;若使用反向代理,还需确认后端未覆盖该头。
三、上线前必做三件事
HSTS一旦生效,浏览器将自动拒绝HTTP访问,错误不可逆(直到max-age过期)。上线前请严格验证:
- 全站所有资源(JS/CSS/图片/接口)均支持HTTPS,且无混合内容(Mixed Content)警告
- 所有子域名已部署有效SSL证书,并测试可通过HTTPS正常访问
- 先用较小 max-age(如
300秒)灰度观察,确认跳转与功能正常后再逐步延长
四、申请HSTS预加载(可选但推荐)
加入Chrome/Firefox/Edge的HSTS预加载列表后,浏览器首次访问即强制HTTPS,无需等待首次响应头。前提条件包括:
- 主域名与所有子域名均已启用HSTS,且
max-age ≥ 31536000,含includeSubDomains和preload - 主域名必须能通过HTTPS直接访问(非重定向),且证书有效、域名匹配
- 提交至 hstspreload.org 并通过自动化检查
提交成功后,通常需数周进入新版本浏览器,且移除预加载条目极为困难——务必确保长期HTTPS能力再提交。

















