nginx获取顶层目录,重写至顶层目录下的index.html

最近再部署测试环境时,考虑到我们的特殊需求,希望按模块进行发布测试,每个模块被放在一个文件夹中进行发布,所以不得不进行重写,来让请求fallback到目录下的index.html. 例如当我们访问 /some-module/xxx/xxx 时,实际上fallback到 /some-module/index.html。而我们发布测试模块时增量的,所以可能过两天会发布一个 any-module 来测试,不大可能写死在 nginx 的 config 中。所以,我的想法是,在 nginx 中实现一种配置,可以实现这种能力。具体实现如下:

location / {
try_files $uri $uri/ index.html @rewrite_uri;
}

location @rewite_uri {
if ($request_uri ~ /([a-z0-9_-:]+)/) {
set $tmp /$1/index.html;
rewrite ^ $tmp break;
}
}

使用 try_files 来在 nginx 中实现 fallback 的能力。增加了一个 @rewrite_uri 的规则,这个规则里面,对 $request_uri 进行匹配,通过正则把顶层目录取出来,在用 rewrite 进行规定。

通过这种方式,我们不仅可以去除顶层目录,而且可以实现我们想要的重写效果。