分流测试应使用 return 302 实现临时重定向,保留$request_uri以追踪参数,通过if或map按cookie/参数精准分流,避免rewrite、error_page误用导致301或内部重写。

分流测试用 302 重定向,核心是让部分用户临时访问新页面,同时不干扰搜索引擎对原 URL 的收录和权重积累。它不是永久搬家,而是“请先去那边看看,随时可能回来”。
明确使用 return 302(推荐)
直接返回状态码 + 目标地址,简洁、高效、无歧义:
- 在 server 或 location 块中写:return 302 https://new-test.example.com$request_uri;
-
$request_uri 保留原始路径和查询参数(如
/product?id=123),方便测试数据追踪 - 不加
permanent或redirect标志,避免 rewrite 指令带来的隐式行为干扰 - 该方式优先级最高,执行后立即终止后续配置,不会误触其他规则
按条件做用户分流(比如 Cookie 或 Header)
只让特定用户跳转,其他人保持原样:
- 用 if 判断 Cookie:if ($http_cookie ~* "test_group=A") { return 302 https://v2.example.com$request_uri; }
- 或用 $arg_ 参数识别测试链接:if ($args ~* "ab=test") { return 302 https://beta.example.com$request_uri; }
- 注意:if 在 location 外使用需谨慎;更稳健的做法是结合 map 指令预定义变量
避免踩坑的关键细节
302 看似简单,但配置错就变相成了 301 或内部重写:
- 别用
rewrite ... redirect替代return 302——rewrite 的 redirect 是 302,但容易和 last/break 混用导致逻辑混乱 - 确保目标域名可访问,且 SSL 证书有效;否则浏览器会报错中断,测试失败
- 不要在 error_page 中直接配 302——error_page 默认是内部重写,必须配合命名 location + return 才能真正跳转
- 测试时用 curl -I 或浏览器开发者工具看响应头,确认返回的是
HTTP/1.1 302 Found和正确的Location











