return 指令可在 HTTP server 块中配合 301 状态码高效实现 HTTP 到 HTTPS 跳转,需监听 80 端口并使用 https://$host$request_uri 保持路径,避免在 HTTPS 块中误用导致循环跳转。

不能用 return 指令“直接”实现 HTTP 到 HTTPS 的强制跳转——因为 return 是 Nginx 的指令,它本身不处理协议切换逻辑,但可以在正确的上下文中(如 HTTP server 块内)配合 301 状态码,**高效、简洁地完成跳转**。
在 HTTP server 块中用 return 301 实现跳转
这是最常用、最推荐的方式。你需要一个专门监听 80 端口的 server 块,在其中用 return 301 将所有请求重定向到对应的 HTTPS 地址。
- 确保你的 HTTPS server 已配置好(监听 443 端口、有有效证书)
- HTTP server 必须明确监听
80端口,且不启用 SSL -
return 301后面的 URL 应使用https://$host$request_uri,保持原始域名和路径
示例配置:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
避免常见错误写法
以下写法不可行或不安全,需特别注意:
- 不要在 HTTPS server 块里用 return 跳转自己:这会造成循环重定向
-
不要写死域名(如
https://example.com)而不带$request_uri:会导致路径丢失,例如/about变成首页 - 不要在 location 块中对全部请求做 return(除非有特殊需求):直接在 server 级处理更清晰、性能更好
配合 listen 指令支持 IPv6 和 HTTP/2(可选增强)
若服务器支持 IPv6 或希望未来兼容 HTTP/2(虽 HTTP/2 通常走 HTTPS),可在 HTTP server 中扩展 listen 配置,但 return 行保持不变:
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$host$request_uri;
}
这样既兼容双栈网络,又不影响跳转逻辑。
验证跳转是否生效
配置完成后重载 Nginx(nginx -s reload),然后测试:
- 用
curl -I http://example.com查看响应头是否有Location: https://...和状态码301 - 检查浏览器地址栏是否自动变为 HTTPS,且无证书警告(说明后端 HTTPS server 工作正常)
- 确认子路径(如
/api/test)也能正确跳转,验证$request_uri是否生效


















