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