Как переписать случайно сгенерированный nginx путь, взяв первый сегмент? - PullRequest
1 голос
/ 11 января 2020

У меня есть экземпляр prestashop, который генерирует случайный URL для доступа администратора. Единственное правило заключается в том, что путь начинается с «admin».

Следующее правило работает просто отлично, но оно жестко запрограммировано вручную:

location /admin6908ewwh6/ {
    if (!-e $request_filename) {
        rewrite ^/.*$ /admin6908ewwh6/index.php last;
    }
}

Я пытался переписать его так:

location ^(/admin.*?)(\w+)/ {
    if (!-e $request_filename) {
        rewrite ^/.*$ $1/index.php last;
    }
}

Но это не работает, и я не знаю почему, так как в соответствии с этим сопоставителем регулярных выражений (https://www.regextester.com/102896), когда я помещаю регулярное выражение ^(/admin.*?)(\w+) против тестовой строки /admin6908ewwh6/index.php/sell/catalog/products/new?_token=_JC1fQPwgvwnhZTWyeGVTy4nET350GC4Aro888TuzDA& это просто захватывает то, что мне нужно взять.

Может кто-нибудь объяснить мне, почему эти два блока местоположения не эквивалентны?

1 Ответ

1 голос
/ 11 января 2020

Проблема $1. Перечисления Numeri c назначаются последним регулярным выражением, которое должно быть оценено, что в данном случае является оператором rewrite (несмотря на то, что в регулярном выражении нет скобок).

Одним из решений является создание захват в операторе rewrite, например:

location /admin {
    if (!-e $request_filename) {
        rewrite ^(/admin[^/]+)/ $1/index.php last;
    }
}

или без блока if:

location /admin {
    try_files $uri $uri/ @admin;
}
location @admin {
    rewrite ^(/admin[^/]+)/ $1/index.php last;
}

или без оператора rewrite :

location ~ ^(/admin[^/]+)/ {
    try_files $uri $uri/ $1/index.php$is_args$args;
}

Убедитесь, что этот последний блок местоположения находится ниже блока, который обрабатывает .php URI.

...