nginx 全站 https 强制加密需闭环“跳转+加密+浏览器信任”:①80端口用return 301跳转https;②443端口启用ssl/tlsv1.2+1.3并配好证书;③添加hsts头启用includesubdomains和preload;④可选开启ocsp stapling。

要在 Nginx 中实现全站 HTTPS 强制加密,关键不是只配好 443 端口,而是把“跳转 + 加密 + 浏览器信任”三件事闭环。光开 HTTPS 不强制跳转,用户仍可能走 HTTP;只做 301 跳转不启用 HSTS,首次访问仍有被劫持风险。
第一步:HTTP 自动跳转到 HTTPS
这是用户能感知到的最基础保障。所有 80 端口请求必须无条件重定向到对应 HTTPS 地址,且保留原始路径和参数。
- 在 Nginx 配置中新增一个 独立的 server 块,监听 80 端口,server_name 与主站点一致(如 example.com www.example.com)
- 使用 return 301(比 rewrite 更高效、更安全),写法为:
return 301 https://$host$request_uri; - 不要在 443 的 server 块里写跳转逻辑,避免循环或冗余
第二步:正确配置 HTTPS 服务(443 端口)
确保 HTTPS 本身稳定、安全、兼容主流设备,证书路径、协议和密钥都得准确。
-
listen 指令必须包含
ssl http2,例如:listen 443 ssl http2; -
证书路径要指向 Let’s Encrypt 或其他 CA 提供的
fullchain.pem和privkey.pem,Linux 下推荐绝对路径,如/etc/letsencrypt/live/example.com/fullchain.pem -
禁用老旧协议:只允许 TLSv1.2 和 TLSv1.3,写法为
ssl_protocols TLSv1.2 TLSv1.3; - 私钥权限设为 600,属主为 Nginx 运行用户(如 www-data 或 nginx)
第三步:启用 HSTS 强制浏览器只走 HTTPS
HSTS 是真正堵住“首次 HTTP 访问被劫持”漏洞的核心机制,它让浏览器记住:这个域名只许用 HTTPS。
- 在 443 的 server 块中添加响应头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; -
max-age=31536000表示一年有效期,时间越长保护越强 -
includeSubDomains把策略扩展到 api.example.com、cdn.example.com 等所有子域 -
preload表示你已准备好提交至浏览器预加载列表(提交后无法撤回,务必确认站点长期稳定支持 HTTPS)
第四步:可选但推荐——开启 OCSP Stapling
加快浏览器验证证书是否被吊销的过程,提升首屏加载速度和安全性。
- 在 443 server 块中添加:
ssl_stapling on;和ssl_stapling_verify on; - 同时需配置可信的 OCSP 响应器(如 Let’s Encrypt 提供的
ssl_trusted_certificate) - 确保系统时间准确,否则 OCSP 验证会失败











