Як перенаправити на інший домен за допомогою NGINX?


136

Як я можу перенаправити mydomain.comта будь-який піддомен *.mydomain.comна www.adifferentdomain.comвикористання NGINX?

Відповіді:


276

server_name підтримує збіги суфіксів із використанням синтаксису .mydomain.com:

server {
  server_name .mydomain.com;
  rewrite ^ http://www.adifferentdomain.com$request_uri? permanent;
}

або на будь-якій версії 0.9.1 або вище:

server {
  server_name .mydomain.com;
  return 301 http://www.adifferentdomain.com$request_uri;
}

1
Мені не потрібно ставити в порт, щоб слухати? наприклад, прослуховуйте 80. У мене є кілька доменів, які мені потрібно переадресувати на основний домен, але мій сервер також має декілька віртуальних серверів для різних інших доменів.
Райан

1
@Ryan listenДиректива за замовчуванням порту 80, коли не вказано. Це насправді трохи складніше, ніж загалом; див. Документи конфігурації nginx для отримання більш детальної інформації.
Іцц

2
Що ?досягає наприкінці?
Дан Даскалеску

5
Яка різниця між rewriteі return 301 $scheme://www.adifferentdomain.com$request_uri;?
Дан Даскалеску

6
? наприкінці перезапису повідомляє nginx не додавати початковий рядок запиту. Оскільки $request_uriрядок запиту вже є, додавати її знову не потрібно. return 301Синтаксис новіше, і не повинна бути ніякої різниці в поведінці між цими двома методами, але коли я спочатку відповів на це питання, багато дистрибутиви не мають необхідну версію, так що я пішов з більш безпечним синтаксисом.
колб'як


15

Навіщо використовувати модуль перезапису, якщо можна return? Технічно кажучи, returnце частина модуля переписання, як ви можете прочитати тут, але цей фрагмент легше читати imho.

server {
    server_name  .domain.com;

    return 302 $scheme://forwarded-domain.com;
}

Ви також можете надати йому переадресацію 301.


1
Чи це також збереже шлях і параметри запитів?
mpen

3
Жоден цей приклад не робить цього @Mark. Але я думаю, ви можете змішати попередні відповіді, щоб придумати щось подібне:return 302 $scheme://forwarded-domain.com$request_uri;
Робін ван Бален

Зі сторони, у багатьох випадках вам, мабуть, слід просто перенаправити на https замість збереження схеми (тобто використовувати https замість $ схеми). Це з тих же причин, що стосуються протоколу, посилання тепер вважаються застарілими - paulirish.com/2010/the-protocol-relative-url
mahemoff

@mahemoff Це не зовсім так. Розглянемо випадок, коли веб-сервер стоїть за вантажним балансиром, який розвантажує ssl.
Себастьян Нейра

11

Це має працювати через HTTPRewriteModule .

Приклад переписати з www.example.com на example.com:

server {    
    server_name www.example.com;    
    rewrite ^ http://example.com$request_uri? permanent; 
}

це просто перенаправлення www.example.com на example.com. Я хочу перенаправити обидва на інший домен. Чи можу я це зробити за одним правилом?
деб

Я точно не знаю, але я думаю, що ім'я_сервера mydomain.com; переписати www.adifferentdomain.com постійний; } повинен це робити? Це повинно зайняти все * .mydomain.com?
удо

@deb ви просто мали б server_name example.com www.example.com;.
цитрусові

Питання спеціально просить будь-які субдомени переадресувати на інший домен. Ця відповідь не відповідає жодному з двох (прямо).
Кіссакі

цього не вистачає важливого 301!
Sliq

9

Якщо ви хочете перенаправити запити з "domain1.com" на "domain2.com", ви можете створити блок сервера, який виглядає приблизно так:

server {
    listen 80;
    server_name domain1.com;
    return 301 $scheme://domain2.com$request_uri;
}

Можливо, комусь потрібно буде перенаправити https: // запит також. listen 443;
Рафік Фархад

0

Тимчасове переадресація

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? redirect;

Постійне переадресація

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? permanent;

У файлі конфігурації nginx для конкретного сайту:

server {    
    server_name www.example.com;
    rewrite ^ http://www.RedictToThisDomain.com$request_uri? redirect;

}

0

Ви можете просто написати, якщо умова всередині блоку {} сервера:

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}

Вам потрібно бути обережним, використовуючи оператори "якщо" на Nginx ( nginx.com/resources/wiki/start/topics/depth/ifisevil ). У цьому випадку ви можете просто використовувати "server_name mydomain.com" замість цього.
Марти

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