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

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


person deb    schedule 18.05.2011    source источник


Ответы (8)


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;
}
person kolbyjack    schedule 18.05.2011
comment
Мне не нужно вставлять порт для прослушивания? например послушайте 80. У меня есть несколько доменов, которые мне нужно перенаправить на основной домен, но на моем сервере также есть несколько виртуальных серверов для различных других доменов. - person Ryan; 26.01.2013
comment
@Ryan Директива listen по умолчанию использует порт 80, если он не указан. На самом деле это немного сложнее, чем обычно; дополнительные сведения см. в документах по настройке nginx. - person Yitz; 23.09.2013
comment
Что ? достигает в конце? - person Dan Dascalescu; 04.07.2014
comment
В чем разница между rewrite и return 301 $scheme://www.adifferentdomain.com$request_uri; ? - person Dan Dascalescu; 04.07.2014
comment
? в конце перезаписи указывает nginx не добавлять исходную строку запроса. Поскольку $request_uri уже имеет строку запроса, нет необходимости добавлять ее снова. Синтаксис return 301 новее, и между двумя методами не должно быть разницы в поведении, но когда я изначально отвечал на этот вопрос, во многих дистрибутивах не было требуемой версии, поэтому я выбрал более безопасный синтаксис. - person kolbyjack; 23.07.2014
comment
Можно ли перенаправить совпадающие субдомены? как перенаправить site.com на site.org, www.site.com на www.site.org и test.site.com на test.site.org? - person MarSoft; 21.06.2015
comment
Для опции return 301 мне нужен вопросительный знак в конце? Кроме того, будет ли http://www.adifferentdomain.com$request_uri включать варианты adifferentdomain, которые не включают www? - person PKHunter; 09.08.2015
comment
@kolbyjack, вы можете посмотреть здесь - person Saras Arya; 14.11.2015
comment
Хороший ответ. Я использовал эту технику для создания SEO-перенаправления с mydomain.com на www.mydomain.com. - person entpnerd; 01.12.2015
comment
Поскольку у меня была куча виртуальных хостов ssl на машине, мне пришлось добавить listen 443 ssl;, чтобы это работало, вместо того, чтобы просто указывать на первый возвращенный виртуальный хост под вводящим в заблуждение доменом. - person notbrain; 16.08.2017
comment
Для тех, кто не хочет, чтобы перенаправление было постоянным, следует использовать код 302. Перенаправление 301 означает, что страница навсегда перемещена в новое место, а перенаправление 302 означает, что перемещение является временным. - person Majid; 08.12.2019
comment
будет ли это работать для сервера веб-страниц или также для внутренних серверов? Я имею в виду, потому что код состояния 301 | 302 - person Carlos.V; 17.07.2020

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

http://wiki.nginx.org/HttpRewriteModule#return

и

http://wiki.nginx.org/Pitfalls#Taxing_Rewrites

person Serhii Topolnytskyi    schedule 17.04.2014

Зачем использовать модуль перезаписи, если можно сделать return? С технической точки зрения, return является частью модуля перезаписи, поскольку вы можете прочитать здесь, но этот фрагмент легче читать, имхо.

server {
    server_name  .domain.com;

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

Вы также можете сделать редирект 301.

person Robin van Baalen    schedule 12.02.2014
comment
Сохранит ли это параметры пути и запроса? - person mpen; 31.12.2014
comment
Нет, этот пример не делает этого @Mark. Но я полагаю, вы можете смешать предыдущие ответы, чтобы получить что-то вроде этого: return 302 $scheme://forwarded-domain.com$request_uri; - person Robin van Baalen; 05.01.2015
comment
Кстати, во многих случаях вам, вероятно, следует просто перенаправить на https вместо сохранения схемы (т.е. использовать https вместо $scheme). По тем же причинам ссылки, относящиеся к протоколу, теперь считаются устаревшими — paulirish. com/2010/the-protocol-relative-url - person mahemoff; 29.04.2015
comment
@mahemoff Это не совсем так. Рассмотрим случай, когда веб-сервер находится за балансировщиком нагрузки, который сбрасывает ssl. - person Sebastian Neira; 22.09.2016

Это должно работать через HTTPRewriteModule.

Пример перезаписи с www.example.com на example.com:

server {    
    server_name www.example.com;    
    rewrite ^ http://example.com$request_uri? permanent; 
}
person udo    schedule 18.05.2011
comment
это просто перенаправление с www.example.com на example.com. Я хочу перенаправить оба на другой домен. Могу ли я сделать это в одном правиле? - person deb; 18.05.2011
comment
Точно не знаю, но думаю, что server_name mydomain.com; переписать www.a Differentdomain.com на постоянный; } должен это сделать? Это должно занять все *.mydomain.com? - person udo; 18.05.2011
comment
@deb у вас будет просто server_name example.com www.example.com;. - person citruspi; 22.08.2012
comment
Вопрос конкретно требует, чтобы любые субдомены перенаправляли на другой домен. Этот ответ не отвечает ни на один из двух (явно). - person Kissaki; 25.09.2014
comment
здесь отсутствует важный 301! - person Sliq; 02.05.2019

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

server {
    listen 80;
    server_name domain1.com;
    return 301 $scheme://domain2.com$request_uri;
}
person ZanMax    schedule 06.01.2017
comment
Кому-то может понадобиться также перенаправить запрос https://. listen 443; - person Rafik Farhad; 24.02.2020

Я использую этот код для своих сайтов

server {
        listen 80;
        listen 443;
        server_name  .domain.com;

        return 301 $scheme://newdomain.com$request_uri;
}
person Tech    schedule 21.10.2020

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

server { 

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

Временное перенаправление

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;

}
person Taimoor Changaiz    schedule 02.10.2018