最直接有效的方式是在nginx中为80端口单独配置server块,用return 301跳转至https并保留$request_uri;需确保443端口正确配置ssl证书及http/2,上线前须nginx -t验证并curl检查301响应与证书有效性。

最直接有效的方式,是在 Nginx 配置中为 80 端口单独定义一个 server 块,用 return 301 指令跳转到 HTTPS 地址,并通过 $request_uri 完整保留原始路径和查询参数。
用 return 301 实现简洁跳转
这是官方推荐做法,语义清晰、性能高、对 SEO 友好。配置只需几行:
- 监听 80 端口,指定
server_name(必须与 HTTPS 的域名一致) - 使用
return 301 https://$host$request_uri; -
$request_uri包含完整 URI(如/path?k=v&id=123),无需额外拼接参数
避免常见错误写法
有些写法看似可行,但存在隐患:
- 别用
$uri+$args拼接:容易漏掉编码字符或空参数,不如$request_uri可靠 - 慎用
rewrite:语法更复杂,执行开销略高,且permanent实际也是返回 301,没必要绕路 - 别在 HTTPS 的
server块里加跳转逻辑:80 和 443 应该是两个独立的server块,职责分明
配合 HTTPS server 块一起部署
跳转本身只是入口控制,HTTPS 服务仍需正常启用:
- 确保 443 端口的
server块已正确配置证书路径(ssl_certificate和ssl_certificate_key) - 建议启用 HTTP/2:
listen 443 ssl http2; - SSL 参数(如协议版本、加密套件)可统一放在
http块中复用,避免重复书写
上线前必做检查
配置改完不能直接 reload,要验证关键环节:
- 先运行
nginx -t确认语法无误 - 用
curl -I http://your-domain.com/test?x=1查看响应头是否为301 Moved Permanently,且Location值含完整 HTTPS URL 和参数 - 确认证书在 443 端口能正常响应,避免跳过去后报 SSL 错误











