random_index 仅支持无状态均匀随机选文件,不支持权重、用户一致性或条件路由;适合快速MVP验证,但不可用于真实灰度测试。

用 random_index 实现静态页面的简易 A/B 测试,核心是让 Nginx 在每次请求时从指定目录中随机选一个 HTML 文件返回,无需后端、不依赖 Cookie 或用户分组,适合快速验证页面文案、布局或 CTA 按钮效果。
确认 Nginx 版本支持 random_index
Nginx 从 0.7.15 开始内置 random_index on; 指令,但仅适用于 index 指令配合的目录索引场景。它不会真正列出文件,而是从目录下所有以 .html(或你配置的 index 后缀)结尾的文件中随机挑选一个作为响应内容。
- 运行
nginx -v确保版本 ≥ 0.7.15(现代发行版基本都满足) - 该功能不支持子目录递归,只扫描配置目录下的**一级 HTML 文件**
- 不支持按权重控制概率,纯均匀随机(如 2 个文件,各 50% 概率)
准备 A/B 页面文件
在网站根目录(例如 /var/www/html/ab-test/)下放两个或多个命名规范的 HTML 文件:
-
index.html(可保留,但会被random_index忽略,除非它是唯一匹配项) page-v1.htmlpage-v2.html- (可选)
page-v3.html—— 增加变体只需多放一个文件
确保这些文件均可独立访问、语义完整,且不含服务端逻辑(因是纯静态)。
配置 Nginx 启用 random_index
在对应 server 块中添加 location 配置:
location /ab/ {
alias /var/www/html/ab-test/;
random_index on;
index page-v1.html page-v2.html; # 此行实际不生效,但建议保留兼容性
}
关键点:
-
alias必须以/结尾,且指向真实目录路径 -
random_index on;是启用开关,无需其他参数 -
index指令在此处不控制随机逻辑,但某些旧版本 Nginx 要求存在,写上更稳妥 - 访问
https://yoursite.com/ab/即触发随机返回page-v1.html或page-v2.html
补充:如何记录或识别当前展示的是哪个版本
random_index 本身不暴露选中文件名,若需统计或调试,可用以下轻量方式:
- 在每个 HTML 文件 head 中嵌入唯一标识:
- 用前端 JS 读取并上报(如发到简单日志接口或 Google Analytics 自定义维度)
- Nginx 日志中无法直接记录选中文件,但可通过
$request_uri固定为/ab/,所以需靠前端埋点区分
若需服务端记录,就得放弃 random_index,改用 Lua(OpenResty)或极简 CGI 脚本做路由——那就超出“简易”范畴了。
这种方式不复杂但容易忽略细节,适合 MVP 验证。真要长期运行、需分流比例可控、用户保持一致体验,就得上专业 A/B 工具或自建路由层。










