random_index 是轻量无状态的文件随机选择机制,需用 random_index_files 显式限定候选文件、确保权限可读、路径末尾带/且目录有执行权,不可与 index 或 try_files 混用。

直接用 random_index on 很简单,但实际部署时容易踩坑。它不是“智能随机”,而是一个轻量、无状态的文件选择机制,关键在控制范围和规避干扰。
只让指定文件参与随机
默认行为会扫描目录下所有非隐藏普通文件,可能误选 .log、.tmp 甚至备份文件。必须用 random_index_files 显式限定候选列表:
- 在 location 块中写:
random_index_files page-a.html page-b.html page-c.html; - 没列进来的文件,哪怕存在也不会被选中
- 不支持通配符(
*.html无效),必须逐个写全名
路径与权限要严格匹配
random_index 不校验文件是否可读,只看是否存在。一旦 Nginx 用户(如 www-data)对某个候选文件无读取权限,请求就会直接返回 403。
- 确保所有
random_index_files列出的文件,属主和权限都允许 Nginx 进程读取(如chmod 644) - alias 或 root 指向的路径末尾必须带
/(例如alias /var/www/ab/;),否则 404 - 目录本身也要有执行权限(
chmod 755),否则无法进入扫描
别和 index 或 try_files 混用
random_index 和 index 指令互斥:只要 random_index on 生效,index 就完全被忽略。try_files 更不能共存,二者逻辑冲突,Nginx 会报错或行为异常。
- 如果需要 fallback 机制(比如灰度用户走指定版本,其他人随机),得用
map + try_files组合,而不是依赖 random_index 自身 - 不要在同一个 location 里同时写
index xxx.html和random_index on
调试与验证小技巧
random_index 本身不暴露选中文件名,但你可以低成本识别当前加载的是哪个版本:
- 每个 HTML 文件 head 中加唯一 meta 标签:
<meta name="ab-variant" content="v2"> - 前端 JS 读取并上报:
document.querySelector('meta[name="ab-variant"]').content - Nginx 日志里 request_uri 始终是
/ab/,所以必须靠前端埋点区分版本











