nginx不支持按权重跳转域名,因跳转是确定性重定向行为;所谓“带权重的多域名跳转”实为混淆概念——真正需权重的是后端负载均衡(upstream+weight),而非前端域名跳转;多域名统一跳转必须用独立server块配合return 301,严禁if+rewrite混搭。

Nginx 本身不支持“按权重跳转域名”——跳转是确定性行为,不是负载分发。所谓“带权重的多域名跳转”,实际是混淆了两个概念:域名跳转(重定向) 和 流量分发(反向代理/负载均衡)。如果你的目标是“多个域名访问时,按不同比例导向主站的不同后端服务”,那属于负载均衡;如果只是想让多个旧域名统一、稳定地跳到一个主域名(比如 old1.com、old2.com 都跳 www.example.com),那就用标准重定向,无需权重。
真正需要权重的场景,通常是:
✅ 多个后端服务共用一个主域名(如 www.example.com),你希望部分请求走 A 服务器,部分走 B 服务器 → 用 upstream + weight
❌ 多个前端域名(如 a.com、b.com、c.com)跳向同一个主域名,还要求“a.com 跳 60% 到主站 HTTPS,40% 到维护页” → 这在 HTTP 重定向层面无法实现(浏览器只认 301/302 响应,不接受概率跳转)
所以,你真正要配的,其实是这两类之一:
多域名统一跳转到主站(无权重,强推荐)
所有非主域名访问,一律 301 重定向到 https://www.example.com$request_uri
必须用独立 server 块,不能用 if:
server {
listen 80;
server_name a.com b.com c.com old.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl;
server_name a.com b.com c.com old.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /path/to/main-cert.pem;
ssl_certificate_key /path/to/main-key.pem;
# 主站真实配置放这里(root、location 等)
}
⚠️ 注意:
server_name列表里写全所有需跳转的域名;HTTP 和 HTTPS 必须分开块;证书路径要真实存在;$request_uri保留路径和参数,SEO 友好。
多域名 → 主域名 → 后端集群(带权重的流量分发)
这才是“权重”真正起作用的地方:主域名(如 www.example.com)接进来后,把请求按权重分发给不同后端节点:
upstream backend_cluster {
server 192.168.1.10:8080 weight=3; # 占比约 60%
server 192.168.1.11:8080 weight=2; # 占比约 40%
# 默认 weight=1,这里显式写出更清晰
}
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://backend_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
这样,无论用户从 a.com 还是 b.com 进来(先被上面的跳转块重定向到 https://www.example.com),最终请求都会按权重落到后端两台机器上。
为什么不能对跳转本身加权重?
- HTTP 重定向是客户端行为:Nginx 发一个
Location: xxx响应头,浏览器自己跳,Nginx 不再参与后续; - 没有中间态或概率控制机制;
- 强行用
map+random或 Lua 实现“随机跳转”,不仅破坏缓存、伤害 SEO,还会被搜索引擎视为不可靠跳转,甚至判定为恶意行为。
如果你确实有灰度发布、A/B 测试等需求,正确做法是:
- 用
map+$remote_addr或$cookie_uid做一致性哈希分流; - 或在应用层(如 Node.js/PHP)根据用户特征返回不同跳转地址;
- Nginx 层只做确定性、可审计的重定向。
不复杂但容易忽略:跳转是入口守门员,要干净、明确、可预测;权重是后端调度员,管的是请求怎么跑。分清角色,配置才稳。











