nginx перенаправление нескольких URL-адресов с картой - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь перенаправить кучу старых URL-адресов на новые UR-адреса с помощью директивы map. Я могу делать простые, но как бы застрял на тех, у которых есть параметры запроса.

Мне нужно это сделать

/people.php?personid=20 -> /people/20
/events.php/eventid=20 -> /event/20
/info.php?name=john&age=20 -> /person/john/20

У меня есть директива карты

map $request_uri $redirected_uri {
~^people.php\?personid=(.*)^ /people/$1?;
}

Но, похоже, не работает. Любая помощь будет оценена. Заранее спасибо.

Мой серверный блок имеет этот код

if ($redirected_uri) {
   rewrite  ^ $redirected_uri permanent;
}

Кроме того, я пытаюсь сделать следующее, а также переписать / people / 20 обратно людям. php? PersonId = 20 Итак, для этого у меня есть это

map $request_uri $new_uri {
default 0
~^/people/(.*) /people.php?personId=$1;
}

, а затем в серверном блоке

if ($new_uri) {
rewrite ^ $new_uri last; // this doesn't work, throws 404
}

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Захват numeri c выходит за пределы области видимости, как только вычисляется другое регулярное выражение, поэтому сам оператор rewrite стирает значение $1 из предыдущего оператора map.

Вместо этого вы можете использовать оператор return:

if ($redirected_uri) {
    return 301 $redirected_uri;
} 

Или, что еще лучше, используйте именованный захват в map:

map $request_uri $redirected_uri {
~^/people\.php\?personid=(?<personid>.*)$ /people/$personid;
}

Обратите внимание, что Nginx URI начинаются с ведущим /, у вас был неэкранированный ., а правильная привязка для конца регулярного выражения - $.

0 голосов
/ 17 июня 2020

Обычный способ решения этой проблемы выглядит примерно так:

map $request_uri $redirect {
    default                          0;
    ~^/people.php\?personid=(\d+)^    /people/$1;
    ...
}

server {
    ...
    if ($redirect) {
        set $args '';
        return 301 $redirect;
    }

Я ограничил группу захвата после personid= цифрами: \d+

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...