Nginx переписывает с косой чертой и без нее

Я пытаюсь создать набор правил, которые соответствуют URL-адресу с косой чертой и без нее.

Большинство ответов указывали мне на использование чего-то подобного этому.

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;                                   │
}   

Но это не соответствует URL-адресу косой черты.

Как я могу написать правило, которое соответствует URL-адресам, которые выглядят как

http://example.com/node/file/abcd/1234/
http://example.com/node/file/abcd/1234

person Daniel Luca CleanUnicorn    schedule 30.01.2017    source источник


Ответы (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;
person Richard Smith    schedule 30.01.2017
comment
Это работает. Я забыл, что .* будет соответствовать всему, включая косую черту. - person Daniel Luca CleanUnicorn; 30.01.2017