【问题标题】:nginx rewrite map file, with or without a trailing slashnginx 重写映射文件,带或不带斜杠
【发布时间】:2017-10-02 08:56:47
【问题描述】:

使用地图文件将大量位置重写为目的地时:

rewrite ^ $my_redirect_map permanent;

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

/foo/ /bar;

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

可以通过在映射文件中包含每个条目的重复项来解决此问题(带有或不带有尾部斜杠。)

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

【问题讨论】:

    标签: nginx


    【解决方案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

    【讨论】:

    • ~^/foo/?还将匹配和重定向 /foo/something,而 OP 只想要 foo 或 foo/。正确的正则表达式是 ~^/foo/?$ 表示区分大小写或 ~*^/foo/?$ 表示不区分大小写。
    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2019-07-18
    • 1970-01-01
    • 2015-01-27
    相关资源
    最近更新 更多