Nginx перенаправляет все старые доменные домены на новый

10

У меня был очень длинный домен, поэтому я решил изменить его на более короткий и более дружественный. Но так как у меня много поддоменов (фактически, у меня есть подстановочный знак поддомена), я хотел сохранить поддомен при изменении только доменной части. Итак, я сделал следующее правило:

server {
  listen 80;
  server_name ~^(\w+)\.olddomain\.com$;

  rewrite ^ $scheme://$1.doma.in$request_uri? permanent;
}

Я прочитал много других вопросов, где этот фрагмент решил проблему. Но со мной Nginx всегда перенаправляет .domain.inбез каких-либо поддоменов. Что мне не хватает? Я протестировал регулярное выражение с регулярным выражением regex101, и примеры работают нормально, Nginx, кажется, не может его перенаправить.

ranisalt
источник

Ответы:

22

Начиная с nginx 0.8.25 именованные захваты могут использоваться в server_name. Вы должны использовать их.

Здесь субдомен будет храниться в переменной с именем $sub. Тогда вы сможете повторно использовать его в rewriteдирективе:

server {
  listen 80;
  server_name ~^(?<sub>\w+)\.olddomain\.com$;
  rewrite ^ $scheme://$sub.doma.in$request_uri? permanent;
}

В качестве альтернативы, вы можете оставить свой фактический Regex и использовать его $1в returnдирективе:

server {
  listen 80;
  server_name ~^(\w+)\.olddomain\.com$;
  return 301 $scheme://$1.doma.in$request_uri;
}

Наконец, обратите внимание, что returnдиректива - лучший подход для перенаправления. Вы можете столкнуться с ловушками, используя rewriteдля перенаправления.

krisFR
источник
Отлично. Я использовал метод возврата, но все еще назвал часть регулярных выражений, это гораздо легче понять.
Ранисалт
Что, если мы хотим перенаправить и без субдомена (www)? например: sub1.ex.to> sub1.new.in и ex.to> www.new.in?
Р. Кансер Янбакан
1
Обратите внимание, что «\ w» не соответствует определенным символам, которые могут быть в доменных именах, например, «-». Поэтому вышеприведенное регулярное выражение будет перенаправлено test-sub.doma.inна .domai.in!
Вольфганг
используйте [\ w \ - \ _] + вместо \ w + для поддоменов, в которых есть - и _ в них
Саджад Ашраф
Что ~в регулярном выражении делать в начале? Это не делает, так как это что-то появится раньше ^в регулярных выражениях.
hobbes3