我正在使用地图文件将大量地点重写到目的地:
rewrite ^ $my_redirect_map permanent;
在地图文件中,我的一些重定向看起来像这样(包括尾部斜杠):
/foo/ /bar;
但是,如果nginx收到没有尾部斜杠的请求,例如http://example.com/foo然后重定向就不会发生。
我可以通过包含地图文件中每个条目的重复项来解决这个问题,包括和不包含尾部斜杠。
但有没有办法指示nginx在处理重写时忽略尾部斜杠?它应该以另一种方式工作,即。如果地图文件说/ foo并且请求说/ foo /它应匹配。
答案 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。