Nginx中HTTP到HTTPS重定向应使用return 301指令监听80端口,结合$host和$request_uri实现精准跳转;需同步配置443端口HTTPS服务并启用SSL及HSTS,避免循环跳转。

直接在 Nginx 中配置 HTTP 到 HTTPS 的重写,核心是监听 80 端口、捕获所有请求,并用 301 永久重定向跳转到对应的 HTTPS 地址。这不是“平滑升级”Nginx 本身,而是对流量协议的平滑切换——用户无感,搜索引擎会更新索引,旧链接依然有效。
推荐方式:用 return 指令(简洁高效)
这是当前最主流、最推荐的做法,性能好、语义清晰、不易出错:
- 在
server块中监听 80 端口,匹配所有 HTTP 请求 - 使用
return 301直接构造目标 HTTPS URL - 关键变量:
$host(实际访问的域名)、$request_uri(完整路径+查询参数),确保跳转后地址完全一致
示例配置:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
备选方式:用 rewrite 指令(兼容旧习惯)
功能等效,但多一层正则匹配,略冗余;仅在需做路径改写(如同时调整路径结构)时才需要:
-
rewrite ^(.*)$ https://$host$1 permanent;——$1引用整个 URI -
rewrite ^ https://$host$request_uri permanent;—— 更简洁,^匹配空字符串也成立,直接拼接 - 必须加
permanent标志,否则默认是临时重定向(302)
HTTPS 服务端必须同步配置
仅重定向不够,后端 HTTPS 服务必须已就绪,否则会形成“跳过去却打不开”的死循环:
- 新增一个
server块,监听 443 端口,启用 SSL - 正确配置
ssl_certificate和ssl_certificate_key - 建议开启 HSTS(
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;),让浏览器自动补全 HTTPS
验证与注意事项
- 修改后执行
nginx -t测试语法,再nginx -s reload生效 - 用 curl 测试:
curl -I http://example.com应返回HTTP/1.1 301 Moved Permanently及Location: https://... - 避免在 HTTPS server 块里再写 redirect 或 rewrite 回 HTTP,会造成循环跳转
- 若使用 CDN(如 Cloudflare),注意其是否已代管 SSL,此时 Nginx 可能只需处理内部 HTTP,外部由 CDN 负责 HTTPS


















