推荐用 return 301 实现多域名统一跳转到主站,比 rewrite 更简洁可靠;http 和 https 各设独立 server 块,通过 server_name 列出待跳转域名,统一 return 301 到 https://www.example.com$request_uri,并确保 ssl 证书有效。

直接用 return 301 实现多域名统一跳转到主站,比 rewrite 更简洁、可靠,也更符合生产环境要求。Nginx 官方推荐在只需跳转(不涉及路径改写)时优先使用 return,避免正则匹配开销和潜在逻辑错误。
核心思路是:用两个独立的 server 块分别处理 HTTP 和 HTTPS 入口,每个块中通过 server_name 列出所有需跳转的域名,并统一 return 301 到目标主域名,同时保留 $request_uri。
HTTP 请求全部跳转到主站 HTTPS 版本
这个块负责拦截所有明文请求(无论是否带 www、是否旧域名),强制升级协议并归一化域名。
-
listen 80监听标准 HTTP 端口 -
server_name后空格分隔所有待跳转的域名(如example.com www.example.com old-site.com) -
return 301 https://www.example.com$request_uri;确保协议升级 + 域名归一 + 路径参数完整保留
示例配置:
server {
listen 80;
server_name example.com www.example.com old-site.com;
return 301 https://www.example.com$request_uri;
}
HTTPS 下非主域名请求也跳转(如 https://example.com → https://www.example.com)
用户若直接输入 https://example.com,会绕过 80 端口,必须单独配置一个仅用于跳转的 HTTPS server 块。
-
listen 443 ssl启用加密连接 -
server_name example.com只匹配裸域名(不匹配 www) - 必须配置有效的 SSL 证书(支持该域名),否则 Nginx 启动失败或浏览器报证书错误
- 同样用
return 301跳转,目标保持https://www.example.com$request_uri
示例配置:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
return 301 https://www.example.com$request_uri;
}
主站服务块(真正提供内容的 HTTPS 块)
这个块不参与跳转,只响应 https://www.example.com 的请求,加载网站实际配置(root、PHP、反向代理等)。
-
server_name www.example.com必须精确匹配 - SSL 证书路径可与上一块复用(推荐通配符
*.example.com或多域名证书) - 此处无需
return,也不应放跳转逻辑
示例片段:
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
root /var/www/html;
index index.html;
# 其他 location、php、proxy 配置...
}
注意事项
- 修改配置后务必执行
sudo nginx -t检查语法,再运行sudo nginx -s reload生效 - 不要在一个
server块里混用多个server_name并试图用if+rewrite判断跳转——易出错且性能差 -
$request_uri包含问号及之后全部查询参数(如/path?utm=abc),确保跳转后参数不丢失 - 若需跳转时不带参数(例如只跳首页),可将
$request_uri替换为/,但一般不建议
不复杂但容易忽略











