Назад | Перейти на главную страницу

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

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

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

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

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

Начиная с 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;
}

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

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

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