Nginx перенаправляє всі старі піддомени домену на новий


10

У мене був дуже довгий домен, тому я вирішив змінити його на коротший і більш привітний. Але оскільки у мене багато субдоменів (насправді у мене є підмітка піддомену), я хотів зберегти піддомен, змінюючи лише частину домену. Отже, я прийняв таке правило:

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

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

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

Відповіді:


22

Оскільки nginx 0.8.25 названих захоплень може використовуватися в ім'я_сервера. Ви повинні їх використовувати.

Тут субдомен буде зберігатися у змінній, що називається $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для переадресації.


Ідеально. Я використовував підхід повернення, але все ж назвав частину регулярного виразів, це зрозуміти набагато простіше.
Ранісальт

Що робити, якщо ми хочемо переспрямувати і без субдомена (www)? як: sub1.ex.to> sub1.new.in та ex.to> www.new.in?
Р. Кансер Янбакан

1
Зауважте, що "\ w" не відповідає певним символам, які можуть бути в доменних іменах, наприклад "-". Отже, вищевказаний вираз буде перенаправлений test-sub.doma.inна .domai.in!
Вольфганг

використовуйте [\ w \ - \ _] + замість \ w + для субдоменів, які мають - і _ в них
Саджджад Ашраф

Що робить ~регекс на початку? Це не робить, оскільки щось з'явилося раніше ^в регулярному виразі.
hobbes3
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.