nginx重写映射文件,带或不带斜杠

时间:2017-10-02 08:56:48

标签: nginx

我正在使用地图文件将大量地点重写到目的地:

rewrite ^ $my_redirect_map permanent;

在地图文件中,我的一些重定向看起来像这样(包括尾部斜杠):

/foo/ /bar;

但是,如果nginx收到没有尾部斜杠的请求,例如http://example.com/foo然后重定向就不会发生。

我可以通过包含地图文件中每个条目的重复项来解决这个问题,包括和不包含尾部斜杠。

但有没有办法指示nginx在处理重写时忽略尾部斜杠?它应该以另一种方式工作,即。如果地图文件说/ foo并且请求说/ foo /它应匹配。

1 个答案:

答案 0 :(得分:1)

问题在于地图文件中的初始匹配。您无法在rewrite声明中解决此问题。

最简单的解决方案是在map指令的包含文件中使用正则表达式:

~^/foo/? /bar;

然而,一个不太优雅的解决方案是使用两个map指令,两个指令都包含相同的映射文件:

map $uri $without {
    include /path/to/file;
}
map $uri/ $with {
    include /path/to/file;
}

server {
    ...
    if ($with) { return 301 $with; }
    if ($without) { return 301 $without; }
    ...
}

但是,包含文件需要指定尾随/才能匹配这两种情况。

有关详细信息,请参阅this document