Nginx 中设置 HSTS 需在 server 块 HTTPS 配置内使用 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;,必须加 always 参数以确保所有响应(含错误码)均发送,且 location 块中需重复声明或统一置于 server 顶层。

在 Nginx 中设置 HSTS(HTTP Strict Transport Security)的 max-age,是通过添加 Strict-Transport-Security 响应头实现的,核心在于正确配置 add_header 指令,并注意其继承与覆盖行为。
基础配置:用 add_header 设置 max-age
Nginx 本身不提供专用的 HSTS 指令,需手动添加响应头。最常用写法如下:
- 在
server块(HTTPS 配置内)中加入:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
其中 max-age=31536000 表示 1 年(单位为秒),可根据需要调整,例如:
-
max-age=63072000→ 2 年 -
max-age=3600→ 1 小时(适合测试阶段) -
max-age=0→ 主动撤销已缓存的 HSTS 策略(需客户端支持且之前已接收过有效策略)
关键细节:always 参数不能省略
默认情况下,add_header 只对 2xx 和 3xx 响应生效。HSTS 头必须在所有 HTTPS 响应中稳定返回(包括重定向、错误页等),否则浏览器可能不启用或提前失效。因此务必加上 always 标志:
- ✅ 正确:
add_header ... always; - ❌ 错误:
add_header ...;(301/404/500 等响应中不会发送 HSTS)
避免子配置覆盖:location 块中需重新声明
add_header 在 Nginx 中不会继承,父块(如 server)设置的头,在子 location 块中会被清空,除非显式重写。常见陷阱:
- 如果用了
location /api { ... }且未在此处重复添加 HSTS 头,API 接口响应将不含该头 - 解决方法:在每个需要保障安全的
location块中都加一遍,或统一放在server块顶层(推荐)
验证是否生效
配置完成后重载 Nginx(nginx -s reload),然后访问站点,用浏览器开发者工具检查响应头:
- 打开 Network → 任意请求 → Response Headers
- 确认存在:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload - 可访问 hstspreload.org 提交域名前,先确保 header 完整且
max-age ≥ 31536000、含includeSubDomains和preload


















