Nginx автоматически добавляет подстановочные знаки в перенаправления

Я делаю некоторые перенаправления с nginx, но для некоторых он автоматически сопоставляет все в конце URL, что создает перенаправления на неправильные страницы.

У меня есть эти два перенаправления.

location /en/blogging {
  return 301 /en/blog;
}

location ~^/en/blogging/(?<suffix>.*)$ {
  return 301 /en;
}

Проблема в том, что первый, кажется, автоматически добавляет подстановочный знак к перенаправлению.

Текущий результат:

/ Ы / блоггинг

/ EN / блоги / тест

/ О / bloggingtest

Все перенаправлены на

/ Ы / блог

Ожидаемый результат:

/ en / blogging -> / en / blog

/ en / blogging / test -> / en

/ ru /bloggingtest -> Без перенаправления

Почему это происходит и как я могу избежать этого?

1 ответ

Решение

Ты используешь location /en/blogging который соответствует любому URI, который начинается с /en/blogging, Вы должны использовать location = /en/blogging если вы хотите сопоставить один URI /en/blogging,

Заявление location ~^/en/blogging/(?<suffix>.*)$ будет соответствовать любому URI, который начинается с /en/blogging/ - но потом так же location /en/blogging/, но без дополнительной сложности регулярного выражения и без захвата суффикса.

Например:

location = /en/blogging {
  return 301 /en/blog;
}

location ^~ /en/blogging/ {
  return 301 /en;
}

^~ Модификатор может быть необходим для изменения приоритета расположения префикса, особенно если у вас есть другие конфликтующие расположения регулярных выражений в том же server блок. Смотрите этот документ для деталей.

Другие вопросы по тегам