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

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

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

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

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

1 ответ

Решение

Начиная с 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 для перенаправления.

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