最稳妥方式是用return 301指令分别在listen 80和listen 443 ssl的server块中实现全站跳转,保留$request_uri确保路径参数不丢失,并需为https块配置有效ssl证书。

直接用 return 301 是最稳妥的方式,比 rewrite 更简洁、高效,也更不容易出错。如果你确实需要在 nginx.conf(或站点配置文件)里实现“所有非主域名请求强制跳转到主域名”,核心就是监听 HTTP(80 端口)和 HTTPS(443 端口)两个入口,分别处理跳转逻辑。
下面分场景说明关键配置要点:
主域名统一跳转(HTTP → HTTPS + 主域名)
这是最常见的需求:把 example.com、www.example.com、old-domain.com 等全部收归到 https://www.example.com。
server {
listen 80;
server_name example.com www.example.com old-domain.com;
return 301 https://www.example.com$request_uri;
}
-
server_name列出所有需要跳转的域名(空格分隔) -
return 301直接返回永久重定向,不走 rewrite 解析流程,性能更好 -
$request_uri保留原始路径和查询参数(如/about?ref=abc)
HTTPS 下的域名归一(可选但推荐)
如果用户已经访问了 HTTPS 的非主域名(比如 https://example.com),你也希望它跳到 https://www.example.com,那就再加一个 HTTPS server 块:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
return 301 https://www.example.com$request_uri;
}
⚠️ 注意:这个块必须有合法 SSL 证书才能启动,否则 Nginx 会报错拒绝加载。
使用 rewrite 的情况(仅当需路径改写时才用)
rewrite 更适合需要修改 URI 路径本身(不只是换域名)的场景,例如:
- 把
/blog/xxx改成/news/xxx - 把带参数的旧链接结构重写为新结构
如果只是纯域名跳转,return 就够了;硬要用 rewrite,写法类似:
server {
listen 80;
server_name example.com www.example.com;
rewrite ^(.*)$ https://www.example.com$1 permanent;
}
但注意:
-
permanent等价于return 301 -
rewrite会触发一次内部重写流程,多一层开销 - 若正则写错(比如漏了
^或$),可能造成循环跳转
多个主域共存?用 if 不推荐
不要用 if ($host != "www.example.com") { return 301 ... } —— Nginx 官方明确不建议在 server 块中用 if 做 host 判断,容易引发意外行为(尤其配合 rewrite 时)。正确做法是为每个非主域名单独配一个 server 块,或像上面那样统一列在 server_name 中。
生效前别忘了这步
改完配置后,务必验证并重载:
sudo nginx -t # 检查语法是否正确 sudo systemctl reload nginx # 或 sudo nginx -s reload
配置生效后,访问 http://example.com/test 就会 301 跳到 https://www.example.com/test,搜索引擎也会逐步把权重转移到新地址。











