推荐使用 return 301 实现 HTTP 到 HTTPS 跳转,即在 listen 80 的 server 块中配置 return 301 https://$host$request_uri;,保留原始路径与参数;同时需独立配置 listen 443 ssl 的 server 块并启用有效证书。

在 Nginx 中,将 HTTP 请求重定向到 HTTPS,**不推荐用 rewrite 实现**,而应使用更清晰、高效且符合语义的 return 301 方式。Rewrite 虽然能达成效果,但容易引发循环重定向、性能开销略高,且可读性差。
✅ 推荐方式:用 return 301 强制跳转(标准做法)
在 HTTP 监听块(通常是 server { listen 80; ... })中直接返回 301 重定向:
server {
listen 80;
server_name example.com www.example.com;
<pre class="brush:php;toolbar:false;"># 强制跳转到 HTTPS,保持原始请求路径和参数
return 301 https://$server_name$request_uri;}
-
$server_name:复用配置中的域名,确保跳转目标准确(也可写死为
https://example.com) -
$request_uri:完整保留路径、查询参数(如
/a/b?x=1),避免丢失信息 - 该方式无正则匹配开销,响应快,Nginx 官方文档明确推荐
⚠️ 不推荐的 rewrite 写法(仅作了解)
如果硬要用 rewrite,需注意必须加 redirect 或 permanent 标志,否则默认是内部重写(不发 301):
rewrite ^(.*)$ https://$server_name$1 permanent;
-
permanent等价于redirect(302),但语义上建议用permanent表示 301 - 正则
^(.*)$捕获全部路径,$1回填,功能等效但多一层匹配 - 若遗漏
permanent,请求会变成内部跳转(仍走 80 端口),极易导致 500 或循环
? 补充:确保 HTTPS server 正常工作
仅配置 HTTP 跳转不够,还需存在有效的 HTTPS server 块:
server {
listen 443 ssl http2;
server_name example.com;
<pre class="brush:php;toolbar:false;">ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# 其他配置...
location / {
root /var/www/html;
index index.html;
}}
- 必须启用
ssl参数,否则 443 端口只处理明文,浏览器会拒绝连接 - 证书路径要真实存在,权限正确(Nginx 进程需有读取权限)
- 建议同时监听
http2提升性能
? 验证是否生效
重启 Nginx 后,用 curl 测试跳转逻辑:
curl -I http://example.com/test?x=1
应看到响应头包含:
HTTP/1.1 301 Moved Permanently
Location: https://example.com/test?x=1
- 若返回 200 或无 Location 头,说明跳转未触发(检查 listen 80 的 server 是否被其他配置覆盖)
- 若出现重定向循环(curl 报错 "too many redirects"),常见原因是 HTTPS server 中又误配了跳转规则











