Nginx使用和不使用尾部斜杠重写

时间:2017-01-30 16:05:03

标签: nginx nginx-location

我尝试创建一组匹配带有和不带斜杠的网址的规则

大多数答案都指向我使用类似的东西。

location /node/file/ {                                                                                         
    rewrite ^/node/file/(.*)/(.*)$ /php/node-file.php?file=$1&name=$2;                                    
    rewrite ^/node/file/(.*)/(.*)/?$ /php/node-file.php?file=$1&name=$2;                                   │
}   

但这与尾随的斜杠网址不匹配。

如何编写符合

的网址的规则
http://example.com/node/file/abcd/1234/
http://example.com/node/file/abcd/1234

1 个答案:

答案 0 :(得分:1)

第一个rewrite语句包含(.*)作为最后一次捕获,它将匹配任何字符串,包括一个带有斜杠的字符串。

使用字符类[^/]匹配除/以外的任何字符:

rewrite ^/node/file/([^/]*)/([^/]*)$ /php/node-file.php?file=$1&name=$2;                                    
rewrite ^/node/file/([^/]*)/([^/]*)/?$ /php/node-file.php?file=$1&name=$2;

现在您将注意到第一个rewrite语句是不必要的,因为第二个rewrite语句匹配带有和不带尾随/的URI。

所以你需要的只是:

rewrite ^/node/file/([^/]*)/([^/]*)/?$ /php/node-file.php?file=$1&name=$2;