Nginx强制HTTPS需两步:80端口用return 301跳转至HTTPS,确保$host$request_uri保留路径;443端口server块中配置add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;启用HSTS。

在 Nginx 中强制客户端使用 HTTPS,核心是两步:让 HTTP 请求自动跳转到 HTTPS,再通过 HSTS 告诉浏览器“以后只许走 HTTPS”。光做跳转不够安全,因为首次访问仍可能被劫持;HSTS 才是真正堵住漏洞的关键。
配置 80 端口自动跳转 HTTPS
这是最基础、最必须的一步。所有 HTTP 请求(端口 80)都应无条件重定向到对应的 HTTPS 地址。
- 在 http 块内新增一个 server 块,监听 80 端口
- 用 return 301 实现永久重定向,比 rewrite 更高效、更可靠
- 确保 server_name 与 HTTPS 的 server 保持一致,避免匹配失败
示例配置:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}配置 443 端口启用 HTTPS
只有 HTTPS 服务正常运行,跳转才有意义。这一步需确认证书路径、协议和加密套件都正确。
-
ssl_certificate 和 ssl_certificate_key 路径必须准确,Windows 用正斜杠或双反斜杠,Linux 建议用绝对路径如
/etc/nginx/ssl/example.com.crt - 强制启用 TLSv1.2 或更高版本,禁用不安全协议(如 SSLv2/SSLv3)
- 私钥文件权限设为 600,且属主为 Nginx 运行用户(如 nginx 或 www-data)
示例片段:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
# 其他 location 等配置...
}启用 HSTS 强制浏览器只走 HTTPS
仅靠 301 跳转无法防止首次访问时的中间人攻击。HSTS 是由服务器通过响应头告诉浏览器:“接下来一段时间内,不准用 HTTP 访问我”。
- 在 HTTPS 的 server 块中添加 add_header Strict-Transport-Security
- max-age=31536000 表示一年有效期(推荐值),时间越长,保护越持久
- 加 includeSubDomains 可将策略扩展至所有子域名(如 api.example.com)
- 若准备提交到浏览器预加载列表,还需加上 preload 参数(注意:加入后无法轻易撤回)
示例头部:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
验证与注意事项
配置完成后务必验证,否则可能造成网站不可访问。
- 执行 nginx -t 检查语法是否正确
- 用 curl -I http://example.com 确认返回 301 且 Location 头指向 HTTPS
- 访问 https://example.com 后检查响应头是否包含正确的 Strict-Transport-Security
- 首次启用 HSTS 时建议先设较短 max-age(如 300 秒),测试无误后再调高
- 确保防火墙开放 443 端口,且云服务商安全组也放行


















