首页 文章

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

提问于
浏览
1

我正在使用 Map 文件将大量位置重写到目的地:

rewrite ^ $my_redirect_map permanent;

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

/foo/ /bar;

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

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

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

1 回答

  • 1

    问题在于 Map 文件中的初始匹配 . 您无法在 rewrite 语句中修复此问题 .

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

    ~^/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 .

相关问题