最稳妥的做法是在监听80端口的server块中使用return 301指令跳转至https://$host$request_uri,完整保留路径与参数;同时必须配置独立的listen 443 ssl server块并正确启用SSL证书及TLS安全策略。

最稳妥的做法是在监听 80 端口的 server 块中使用 return 301 指令,把所有 HTTP 请求永久跳转到对应的 HTTPS 地址,同时完整保留路径和查询参数。
基础跳转配置(推荐)
这是生产环境首选方式,语法简洁、性能高、语义明确,不依赖正则引擎,Nginx 1.0+ 全版本支持:
- 在
listen 80的server块中写入:return 301 https://$host$request_uri; -
$host动态取请求头中的 Host 值,适配多域名或泛解析场景,比硬编码$server_name更可靠 -
$request_uri包含完整 URI(路径 + ? 后全部参数),无需额外拼接$args,避免漏参 - 该指令不触发 rewrite 流程,执行最快,且返回标准 301,对 SEO 友好
HTTPS 服务本身必须可用
跳转只是引导,后端 HTTPS 服务必须能正常响应,否则用户会看到连接失败或证书错误:
- 必须存在一个独立的
listen 443 ssl的server块 - 正确配置证书路径:
ssl_certificate和ssl_certificate_key - 启用现代 TLS 协议与加密套件,例如:
ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...; - 旧版 Nginx 中若用
ssl on;,新版建议直接写listen 443 ssl;
代理环境下需额外处理
当 Nginx 前有 CDN、ALB 或 Traefik 等 HTTPS 终结代理时,用户发的是 HTTPS,但代理以 HTTP 转发给 Nginx,此时 $scheme 恒为 http,仅靠 80 端口跳转无效:
- 在
443 ssl server块内添加:error_page 497 =301 https://$host$request_uri;
(497 是 Nginx 定义的“HTTP 到 HTTPS 请求被错误地发送到 HTTPS 端口”错误码) - 确保代理透传
X-Forwarded-Proto: https头 - 若代理 Header 含下划线(如
X-Forwarded-For),需在 http 块开头启用:underscores_in_headers on; - 该方式不是替代 80 端口配置,而是补充:直连走 80 跳转,代理流量走 497 捕获
上线前务必验证
配置生效前做基础检查,避免服务中断或跳转异常:
- 修改前备份原配置:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak - 运行
nginx -t,确认输出 “syntax is ok” 和 “test is successful” - 用
curl -I http://example.com/test?x=1测试,观察是否返回 301 且Location正确 - 在浏览器访问 HTTP 链接,确认地址栏自动变为 HTTPS,且参数未丢失(如
?id=123&ref=test)











