最稳妥、推荐的做法是使用 return 301 指令在监听 80 端口的 server 块中跳转,配合 $host 和 $request_uri 完整保留原始域名、路径及查询参数;nginx 官方推荐该方式,性能更优、语义清晰、seo 友好,且避免 rewrite 的正则开销与循环风险。

最稳妥、推荐的做法是在 Nginx 中单独配置一个监听 80 端口的 server 块,用 return 301 指令跳转,同时使用 $request_uri 保证路径和参数完整保留。
核心配置写法
这是官方推荐的标准方式,简洁高效,对 SEO 友好:
- 在
/etc/nginx/conf.d/或站点配置文件中新增或修改如下内容: server {<br> listen 80;<br> server_name example.com www.example.com;<br> return 301 https://$host$request_uri;<br>}-
$host保持原始域名(如自动适配 www 和非 www);$request_uri包含完整路径 + 查询参数,无需额外拼接
为什么不用 rewrite?
虽然 rewrite ^(.*)$ https://$host permanent; 也能实现跳转,但存在隐患:
-
permanent实际等价于 301,但 rewrite 会触发正则引擎,性能略低 - 某些旧版本 Nginx 对 rewrite 的处理不如 return 稳定
- 若规则复杂,易因正则误匹配导致循环跳转
POST 请求不丢失的关键:状态码选型
普通网页跳转用 301 没问题,但若后端有 API 接口且依赖 POST 方法,需特别注意:
- 301 跳转会令浏览器将 POST 改为 GET,导致请求体丢失
- 此时应改用
return 307 https://$host$request_uri; - 307 是临时重定向,强制浏览器保持原 HTTP 方法(包括 POST、PUT 等)重发请求
配套要点不能漏
跳转生效前,这些步骤必须确认完成:
- HTTPS server 已正常运行:443 端口监听、证书路径正确、SSL 协议与密钥配置无误
- 防火墙放行 443 端口(80 端口通常已开放)
- 修改配置后执行
nginx -t测试语法,再nginx -s reload平滑重载 - 检查响应头中的
Location是否准确,状态码是否为预期的 301 或 307











