背景:业务需要在接口/report上作转发,而其uri的转化规则如下:
/report → / (1)
/report/xxxx → /xxxx (2)
为此,为其配置了如下的rewrite规则:
location /test{
rewrite^/test/(.*) /$1 break;
proxy_pass http://xxxx;
}
结果:并没有达到预期。
问题排查:
1 环境搭建
location /test{
rewrite^/test/(.*) /$1 break;
rewrite ^/test / break;
proxy_pass http://xxxx;
}
配置了两天rewrite指令,可以到达(1)(2)的效果
2 小结
a,如果只配置第一条rewrite指令,能够满足(2)的要求,即:
/test/xxxx → /xxxx
但并不能满足(1)的要求: /test → /
因为在第一条rewrite中,默认了/test后面还会有子目录,$1代表子目录。但访问/test时,并没有子目录存在,这样导致$1为空,不符合rewrite规范,所以这条规则对/test不生效.
(但如果访问/test/ 这样能够达到 /test/ → / 的效果,原因同上,即$1 代表test后面的子目录,即 "/" .)
b,如果第一条没有匹配到,那么进入第二条匹配:
/test 直接重写为 / . 这样 达到/test → / 的目的。
没有看过rewrite的源码,不知道猜测的对不对?有没有更优雅的做法。