nginx强制http跳转https需两步:80端口用return 301跳转至https://$host$request_uri,确保路径完整保留;443端口server块启用ssl并配置证书,且必须添加proxy_set_header x-forwarded-proto $scheme防止反向代理重定向循环。

要让网站默认走 HTTPS,核心是在 Nginx 中把所有 HTTP 请求(端口 80)自动重定向到对应的 HTTPS 地址。这不是单纯加个证书就行,关键在跳转逻辑是否正确、高效且不影响访问体验。
配置监听 80 端口并返回 301 跳转
这是最推荐的方式,简洁、高效、语义明确。在 Nginx 配置中新增一个仅监听 80 的 server 块:
- 使用 return 301 指令,比 rewrite 更快,不触发正则匹配
- 目标地址用 $host$request_uri,能完整保留域名和路径参数
- 确保 server_name 匹配你实际使用的域名(支持多个,用空格分隔)
示例配置:
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
HTTPS 服务本身必须正常运行
跳转只是“指路”,真正承载内容的是 443 端口的 HTTPS server 块。它需要:
- 启用 ssl 参数:listen 443 ssl;
- 正确指定证书路径:ssl_certificate 和 ssl_certificate_key
- 避免硬编码协议或域名,比如 location 内 proxy_pass 应用 http:// 后端时,需透传原始协议
若后端是反向代理(如 Node.js、Python 应用),务必添加这行,否则可能引发重定向循环:
proxy_set_header X-Forwarded-Proto $scheme;验证与常见避坑点
配置完成后不能直接上线,需逐项确认:
- 执行 nginx -t 检查语法,无报错再 nginx -s reload
- 用 curl 测试:curl -I http://example.com → 应返回 HTTP/1.1 301 Moved Permanently 及 Location 头
- 浏览器访问 http 地址,看是否秒跳且地址栏显示 https + 锁图标
- 注意 CDN 或负载均衡器是否已终止 HTTPS —— 若前端已解密,Nginx 收到的是 HTTP,此时 $scheme 是 http,但用户实际走的是 HTTPS,需用 $http_x_forwarded_proto 补救











