У меня сейчас задача сделать миграцию большого сайта. И у меня в 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 под бэкэнд.
Ваш оператор 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
находится вне `серверного блока.
Подробности смотрите в этом документе .