路径前缀结合Cookie实现用户分流,即通过URL路径标识分组、Cookie维持会话一致性,支持前端JS跳转、边缘函数重写、Nginx反向代理三种轻量部署方式。

利用路径前缀实现基于 Cookie 的用户分流,本质是把 Cookie 值和 URL 路径绑定,让后端或边缘逻辑根据请求路径自动识别分组,同时用 Cookie 保证用户会话一致性。这种方式不依赖复杂路由模块,部署轻量、兼容性强,适合静态资源分离、多版本页面并行上线等场景。
核心思路:路径即分组标识
将 A/B 两组内容分别放在不同路径下(如 /ab/a/ 和 /ab/b/),所有请求先统一入口(如 /ab/),由中间层检查 Cookie 决定重写或转发到对应子路径。Cookie 只存一个简单标记(如 ab=v1),路径前缀则作为实际服务路由的依据。
常见实现方式
以下三种方案按部署位置由前端向后端递进,均可结合路径前缀与 Cookie:
- 前端 JS 控制(如 js-cookie):页面加载时读取 Cookie,若为 v1 则跳转至 /ab/v1/,若为 v2 则跳转至 /ab/v2/;新用户随机分配并写入 Cookie,后续访问自动复用路径
- 边缘函数(Cloudflare Workers / 阿里云函数计算等):拦截 /ab/* 请求,解析 Cookie 中的 ab 值,动态改写 URL 路径再 fetch 对应版本(如将 /ab/index.html 改为 /ab/v1/index.html),响应中补回 Set-Cookie
- Nginx 反向代理层:用 map 指令将 $cookie_ab 映射为变量 $ab_path,再在 location 中通过 proxy_pass http://backend$ab_path 转发;或直接用 rewrite ^/ab/(.*)$ /ab/$cookie_ab/$1 break; 重写路径
关键细节要注意
路径前缀方案看似简单,但几个细节决定是否稳定可用:
- Cookie 必须设 Path=/ab/ 或 Path=/,否则子路径下无法读取,导致每次刷新都重新分组
- 静态资源(CSS/JS/图片)建议使用相对路径或统一 base URL,避免因路径前缀变化导致 404
- 若后端需感知分组,可在转发时添加自定义 header(如 X-AB-Group: v1),比解析路径更可靠
- 首次无 Cookie 时的随机分配,建议用 Math.random() 或用户 ID 哈希,避免全部压到同一组
一个可运行的 Nginx 示例
假设你有两个静态版本目录:/var/www/ab/v1/ 和 /var/www/ab/v2/,希望用户按 Cookie 固定访问其中一套:
map $cookie_ab $ab_root {
"v1" "/var/www/ab/v1";
"v2" "/var/www/ab/v2";
default "/var/www/ab/v1";
}
<p>server {
listen 80;
server_name example.com;</p><pre class="brush:php;toolbar:false;">location ^~ /ab/ {
# 若无 Cookie,按 IP 哈希分配并设置(可选)
if ($cookie_ab = "") {
set $ab_cookie "v1";
if ( $remote_addr ~ "^([0-9]{1,3}\.){3}" ) {
set $hash_val $remote_addr;
}
# 简单哈希取模:这里用内置 $msec 取个随机性
if ( $msec ~ "^[0-9]*[02468]$" ) { set $ab_cookie "v2"; }
add_header Set-Cookie "ab=$ab_cookie; Path=/ab/; Max-Age=86400";
}
root $ab_root;
index index.html;
try_files $uri $uri/ =404;
}
}











