Как перенаправить на другой домен с помощью NGINX?

136

Как я могу перенаправить mydomain.comи любой поддомен *.mydomain.comна www.adifferentdomain.comиспользование NGINX?

дебютантка
источник

Ответы:

276

имя_сервера поддерживает совпадения суффиксов с использованием синтаксиса .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;
}
kolbyjack
источник
1
Разве мне не нужно ставить порт для прослушивания? например, прослушать 80. У меня есть несколько доменов, которые мне нужно перенаправить на основной домен, но на моем сервере также есть несколько виртуальных серверов для различных других доменов.
Райан
1
@Ryan В listenдирективе по умолчанию используется порт 80, если он не указан. Это на самом деле немного сложнее, чем в целом; см. документацию по конфигурации nginx для более подробной информации.
Иц
2
Чего ?достичь в конце?
Дан Даскалеску
5
Какая разница между rewriteа return 301 $scheme://www.adifferentdomain.com$request_uri;?
Дэн Даскалеску 04
6
? в конце перезаписи указывает nginx не добавлять исходную строку запроса. Поскольку $request_uriстрока запроса уже есть, нет необходимости добавлять ее снова. return 301Синтаксис новее, и не должна быть никакой разницы в поведении между этими двумя методами, но когда я первоначально ответил на этот вопрос, многие дистрибутивы не имеют требуемую версию, так что я пошел с более безопасным синтаксисом.
kolbyjack
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 вместо $ scheme). Это по тем же причинам, по которым ссылки, относящиеся к протоколу, теперь считаются устаревшими - 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. Я хочу перенаправить оба на другой домен. Могу я сделать это одним правилом?
деб
Я не знаю наверняка, но думаю, что server_name mydomain.com; перезаписать www.adifferentdomain.com навсегда; } должен это делать? Что должно занять все * .mydomain.com?
удо
@deb ты бы просто взял server_name example.com www.example.com;.
citruspi
Вопрос конкретно требует, чтобы любые субдомены перенаправлялись на другой домен. Этот ответ не отвечает ни на один из двух (явно).
Киссаки
здесь отсутствует важный 301!
Sliq
9

Если вы хотите перенаправить запросы для «domain1.com» на «domain2.com», вы можете создать блок сервера, который выглядит следующим образом:

server {
    listen 80;
    server_name domain1.com;
    return 301 $scheme://domain2.com$request_uri;
}
ZanMax
источник
Кому-то может потребоваться также перенаправить 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

Вы можете просто написать условие if внутри блока server {}:

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}
cryptoKTM
источник
Будьте осторожны, используя операторы if на Nginx ( nginx.com/resources/wiki/start/topics/depth/ifisevil ). В этом случае вы можете просто использовать вместо этого server_name mydomain.com.
Марти
if является злым при использовании в контексте местоположения, безопасно при использовании для указания хоста перенаправления
cryptoKTM