灰度发布推荐用nginx的302重定向,因其不被搜索引擎长期缓存且不传递链接权重,适用于短期流量切分、a/b测试或活动页跳转;优先使用return 302而非rewrite,配合if或map实现条件跳转,或通过upstream+proxy_pass实现无跳转式灰度分流。

灰度发布中用 Nginx 做临时引导,推荐用 302 重定向,它不被搜索引擎长期缓存,也不会传递链接权重,适合短期流量切分、A/B 测试或活动页跳转。
直接 return 302 最简洁可靠
适用于明确将某域名或路径整体临时跳转到新地址的场景。Nginx 配置简单、执行快、无 rewrite 解析开销:
- 在 server 或 location 块中写:
return 302 https://gray.example.com$request_uri; -
$request_uri保留原始路径和查询参数,用户访问promo.old.com/a?x=1会跳到https://gray.example.com/a?x=1 - 避免用
rewrite ... redirect,因为默认就是 302,但语义不如return清晰,且多一层正则匹配成本
按请求特征做条件跳转(如参数、Header)
当只对部分用户(比如带特定参数或 Cookie 的请求)做灰度引导时,需配合 if 判断:
- 例如:仅当 URL 含
?v=beta时跳转:if ($args ~ v=beta) { return 302 https://beta.example.com$request_uri; } - 注意:
if在 location 外不可用,建议放在 location 块内;也不支持嵌套,逻辑复杂时考虑用 map 指令预定义变量 - 若基于 Header(如
X-User-Group: canary),可用:if ($http_x_user_group = "canary") { return 302 https://canary.example.com$request_uri; }
配合 upstream 实现无跳转式灰度(更推荐)
严格来说这不是“重定向”,但实际灰度中更常用——用户地址栏不变,后端服务动态分流,体验更平滑:
- 定义两个 upstream:
upstream prod { server 10.0.1.10:80; }和upstream canary { server 10.0.1.11:80; } - 用 map 提取判断依据(如 cookie、参数)生成 $backend 变量
- 在 location 中:
proxy_pass http://$backend; - 这种方式规避了 302 的额外 HTTP 往返,也避免客户端暴露灰度后端地址
302 是灰度引导的轻量选择,关键在“临时”二字。只要没到全量切换阶段,就别用 301;配置时优先用 return 302,少用 rewrite,条件分支控制好范围,避免误伤主流量。











