Как отлаживать большую цепочку редиректов в nginx. Неожиданный редирект

У меня сейчас задача сделать миграцию большого сайта. И у меня в config большое количество редиректов. Но я не могу понять, почему одно перенаправление вызывает второе перенаправление в цепочке. Даже если любой другой ...

У меня сейчас задача сделать миграцию большого сайта. И у меня в config большое количество редиректов. Но я не могу понять, почему одно перенаправление вызывает второе перенаправление в цепочке. Даже если любой другой ...

У меня сейчас задача сделать миграцию большого сайта. И у меня в config большое количество редиректов. Но я не могу понять, почему одно перенаправление вызывает второе перенаправление в цепочке. Даже если любые другие редиректы прокомментированы / отключены.

Итак, моя конфигурация для местоположения:

server {

...
index index.php;

location / {
    try_files $uri $uri/ /index.php?$query_string;
}
location ~* /index.php {
    if ($args ~ "^page=flights&start_city=([\+\w\d\s]*)(&.*)?$"){
        return 301 $scheme://$server_name/flights?departure_city=$arg_start_city;
    }
    if ($is_args){
        return 301 $scheme://$server_name/$1;
    }

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

Что мне ожидать? Я ожидаю, что старые ссылки вроде

https://example.com/index.php?page=flights&start_city=Berlin&s_loc_lat=&s_loc_long=

станут:

https://example.com/flights?departure_city=Berlin

И в то же время ссылки вроде:

https://example.com/index.php?someoldpar=someoldkey&someoldpar2=someoldkey2

станут:

    https://example.com/

Что я получил при тестировании этого конфига?

. Я получил эту цепочку перенаправления для первой ссылки:

 1. GET https://example.com/index.php?page=flights&start_city=Berlin&s_loc_lat=&s_loc_long=
 2. 301 https://example.com/flights?departure_city=Berlin
 3. 301 https://example.com/

Как исключить шаг 3 для уже перенаправленных ссылок? Lavarel под бэкэнд.

1
задан 13 December 2018 в 14:32
1 ответ

Ваш оператор try_files переписывает URI в /index.php и добавляет строку запроса. Ваше утверждение если ($is_args) перенаправляет любой URI со строкой запроса. У вас есть цикл перенаправления.

Блок location ~* /index.php не может отличить оригинальный запрос, содержащий index.php, от результата по умолчанию try_files.

Вам необходимо выполнить тесты переменной $request_uri, которая всегда будет содержать оригинальный запрос вместе со строкой запроса. Вы можете использовать if или map. При использовании более чем нескольких регулярных выражений, предпочтительным решением является карта map. Например:

Например:

map $request_uri $redirect {
    default 0;
    ~^/index.php\?page=flights&start_city=(?<startcity>[\+\w\d\s]*)(&.*)?$ /flights?departure_city=$startcity;
    ~^/index.php\?                                                         /;
}

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

Вы можете удалить свой блок ~* /index.php, так как он больше не нужен. Регулярные выражения вычисляются по порядку до тех пор, пока не будет найдено подходящее правило, поэтому упорядочьте правила с наиболее конкретными первыми и наименее конкретными последними. Используйте именованные захваты, так как числовые захваты могут выйти за пределы области видимости. Вам не нужно указывать схему или имя домена, если они совпадают. Директива map находится вне `серверного блока. Подробности смотрите в этом документе .

.
2
ответ дан 3 December 2019 в 20:11

Теги

Похожие вопросы