ngx_http_random_index_module 是 Nginx 官方轻量模块,用于在请求目录时从指定候选索引文件中随机选取一个返回;需用 random_index_files 显式限定文件列表,不支持通配符、权限校验或 try_files 共存。

ngx_http_random_index_module 是 Nginx 官方提供的一个轻量模块,用于在请求目录(如 / 或 /static/)时,从该目录下**多个候选索引文件中随机选取一个**返回,而不是固定使用 index index.html 中声明的第一个文件。它不依赖外部脚本或 Lua,纯 C 实现,低开销、高并发友好。
启用模块与基础配置
该模块自 Nginx 0.7.21 起默认编译进官方发行版(无需手动添加 --with-http-random-index-module),但需确认是否启用:
- 运行
nginx -V 2>&1 | grep -o with-http-random-index-module,有输出即支持 - 若为精简版(如某些 Alpine 包),可重编译或换用完整版 Nginx
- 配置示例(放在 location 块内):
location / {
random_index on;
# 注意:此时 index 指令将被忽略,不生效
}启用后,Nginx 会扫描请求路径对应本地目录下的所有常规文件(不含子目录),从中随机挑选一个作为响应体返回 —— 这是关键前提:它只看文件名,不校验 MIME 类型或内容。
限定候选文件范围(推荐做法)
默认行为过于宽泛(可能选中 .log、.tmp 等非页面文件),实际使用中必须配合 random_index_files 指令精确控制候选集:
- 该指令接受空格分隔的文件名列表,仅在这些文件存在时参与随机选择
- 未列出的文件即使存在也不参与;列表中不存在的文件不会被创建或回退
- 示例:让
/随机返回home-v1.html、home-v2.html或landing-beta.html
location / {
random_index on;
random_index_files home-v1.html home-v2.html landing-beta.html;
# 不要写 index 指令 —— 它与 random_index 冲突且无效
}注意事项与常见问题
该模块设计简洁,但也带来几个易忽略的限制:
-
不支持通配符或正则:不能写
random_index_files *.html,必须显式枚举 - 不检查文件可读性或权限:若某文件存在但 Nginx 用户无读取权限,请求将返回 403
- 不缓存文件列表:每次请求都实时 readdir() 扫描目录,频繁增删文件不影响结果,但高并发下轻微 I/O 开销
- 不兼容 try_files:二者逻辑冲突,不可在同一 location 共存;如需 fallback 行为,应改用 Lua 或 rewrite + internal 间接实现
典型应用场景
适合轻量 A/B 页面测试、灰度发布首页、多版本静态落地页轮播等无需后端介入的场景:
- 新旧首页并存,按请求随机分流,观察 UV 转化率差异
- 营销活动期间提供多个视觉风格的 landing page,避免用户重复看到同一版
- 静态文档站中,为同一主题提供不同格式入口(如
readme.md、overview.html、quickstart.pdf)
注意:它不提供统计、权重控制或 cookie 粘性,如需这些能力,应转向 OpenResty + Lua 或专用 AB 测试网关。

















