最可靠方式是用独立server块配合return 301实现多域名跳转:HTTP(80端口)和HTTPS(443端口)分别配置专用跳转块,统一重定向至主站HTTPS并保留$request_uri;主站服务块仅响应主域名且不包含重定向逻辑。

直接用独立的 server 块配合 return 301 实现,这是最可靠、SEO 友好且 Nginx 官方推荐的方式。所谓“多个域名跳到一个主站”,本质是入口收敛,不是负载分发,不需要权重、不需要 if 判断,也不该混用 rewrite。
统一 HTTP 流量跳转(80 端口)
所有旧域名的 HTTP 请求,都应第一时间升到主站 HTTPS。配置一个专用 server 块:
- 监听
listen 80,不能和 HTTPS 配置混在一起 -
server_name后空格列出全部需跳转的域名,例如:a.com b.com www.a.com old-site.net - 跳转目标固定写
https://www.example.com$request_uri,不使用$scheme,避免跳到 http - 确保
$request_uri存在,保留路径和查询参数,对 SEO 和用户访问体验至关重要
统一 HTTPS 流量跳转(443 端口)
用户可能直接输入 https://a.com,绕过 HTTP 层,所以必须单独配 HTTPS 跳转块:
- 监听
listen 443 ssl,并正确配置ssl_certificate和ssl_certificate_key - 证书必须覆盖所有跳转域名(推荐 SAN 多域名证书或通配符证书),否则浏览器会拦截
-
server_name同样列出所有非主站的 HTTPS 域名 - 跳转语句与 HTTP 块一致:
return 301 https://www.example.com$request_uri
主站真实服务块(443 端口)
这个块只响应主域名请求,承载实际业务:
-
server_name www.example.com(或你选定的规范主域名) - 同样监听
listen 443 ssl,复用同一份证书(如果已覆盖该域名) - 在这里配置
root、location、proxy_pass等真实服务逻辑 - 不要在这个块里写任何重定向逻辑——职责分离,清晰稳定
验证与避坑要点
配置完成后务必执行这几步,否则容易上线失败:
- 运行
nginx -t检查语法,确认无报错 - 用
nginx -T | grep "server_name"查看实际加载的域名列表,防止空格、大小写或隐藏字符导致匹配失败 - DNS 必须将所有跳转域名解析到这台 Nginx 的 IP,否则请求根本进不来
- 禁止在
server块中使用if ($host = ...)做跳转——Nginx 官方明确不推荐,易出逻辑错误且性能差 - 不要把跳转和别名(alias)混用:别名只是共用文件,地址栏不变;重定向才是真正改变 URL


















