最稳妥的方式是Nginx 80端口用return 301跳转至HTTPS,同时确保443端口HTTPS服务正确配置;需分别配置监听80的跳转server块和监听443的SSL server块,并在代理环境下处理协议错配及头信息透传。

最稳妥的方式是在 Nginx 的 80 端口 server 块中用 return 301 指令跳转,同时确保 443 端口的 HTTPS 服务已正确配置并可用。这不是单纯加几行代码的事,而是两个环节必须同时到位:前端引导 + 后端承接。
监听 80 端口,用 return 301 实现跳转
这是当前生产环境的标准做法,简洁、高效、语义明确:
- 在配置文件中新增或修改一个
server块,监听 80 端口:
server {<br> listen 80;<br> server_name example.com www.example.com;<br> return 301 https://$host$request_uri;<br>} -
$host动态获取请求头中的 Host 值,适配多域名或泛域名;$request_uri包含完整路径和查询参数(如/path?a=1&b=2),无需额外拼接 - 相比 rewrite,return 不触发正则匹配,不依赖 PCRE 库,性能更高,Nginx 1.0+ 全版本支持
独立配置 443 端口的 HTTPS 服务
跳转只是把用户“送过去”,真正能响应 HTTPS 请求,靠的是这个 server 块:
- 必须有单独的
listen 443 ssl;块(旧版写法是ssl on;) - 正确指定证书路径:
ssl_certificate和ssl_certificate_key,路径需真实存在且 Nginx 有读取权限 - 启用现代 TLS 协议与安全套件,例如:
ssl_protocols TLSv1.2 TLSv1.3;<br>ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
代理环境下要额外处理协议错配
当 Nginx 前面有 CDN、ALB 或 Traefik 等 HTTPS 终结代理时,用户发的是 HTTPS,但代理以 HTTP 转发给 Nginx,此时 80 端口跳转失效:
- 在 443 server 块内添加:
error_page 497 =301 https://$host$request_uri; - 代理需透传
X-Forwarded-Proto: https头,Nginx 中可配合map判断协议是否为 https - 若代理头含下划线(如
X-Forwarded-For),需在 http 块开头启用:underscores_in_headers on;
上线前务必验证
改完配置不能直接 reload,得先确认基础逻辑没问题:
- 备份原配置:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak - 语法检查:
nginx -t,看到 “syntax is ok” 和 “test is successful” 才继续 - 用 curl 测试跳转:
curl -I http://example.com/test?x=1,确认返回 301 且Location头含完整 HTTPS 地址


















