Jak przekierować do innej domeny za pomocą NGINX?

139

Jak mogę przekierować mydomain.comi dowolną subdomenę *.mydomain.comdo www.adifferentdomain.comkorzystania z NGINX?

deb
źródło

Odpowiedzi:

280

nazwa_serwera obsługuje dopasowania sufiksów przy użyciu składni .moja_domena.com:

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

lub w dowolnej wersji 0.9.1 lub nowszej:

server {
  server_name .mydomain.com;
  return 301 http://www.adifferentdomain.com$request_uri;
}
kolbyjack
źródło
1
Czy nie muszę podłączać portu, aby nasłuchiwać? np. słuchaj 80. Mam wiele domen, które muszę przekierować do domeny podstawowej, ale mój serwer ma również wiele serwerów wirtualnych dla różnych innych domen.
Ryan
1
@Ryan listenDyrektywa domyślnie przyjmuje port 80, jeśli nie jest określony. W rzeczywistości jest to trochę bardziej skomplikowane niż ogólnie; zobacz dokumentację konfiguracji nginx, aby uzyskać więcej informacji.
Yitz,
2
Co ?osiągniesz na końcu?
Dan Dascalescu,
5
Jaka jest różnica między rewritei return 301 $scheme://www.adifferentdomain.com$request_uri;?
Dan Dascalescu,
6
The? na końcu przepisywania mówi nginx, aby nie dołączał oryginalnego ciągu zapytania. Ponieważ $request_urijuż ma ciąg zapytania, nie ma potrzeby ponownego dodawania go. return 301Składnia jest nowszy, i nie powinno być żadnej różnicy w zachowaniu między tymi dwoma metodami, ale kiedy pierwotnie odpowiedział na to pytanie, wiele dystrybucji nie ma wymaganej wersji, więc poszedłem z bezpieczniejszej składni.
kolbyjack
15

Po co używać modułu przepisywania, jeśli możesz return? Technicznie rzecz biorąc, returnjest częścią modułu przepisywania, jak możesz przeczytać tutaj, ale ten fragment jest łatwiejszy do odczytania imho.

server {
    server_name  .domain.com;

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

Możesz również nadać mu przekierowanie 301.

Robin van Baalen
źródło
1
Czy to zachowa również ścieżkę i parametry zapytania?
otwarte
3
Nie, ten przykład nie robi tego @Mark. Ale przypuszczam, że możesz pomieszać poprzednie odpowiedzi, aby wymyślić coś takiego:return 302 $scheme://forwarded-domain.com$request_uri;
Robin van Baalen
Na marginesie, w wielu przypadkach powinieneś po prostu przekierować do https zamiast zachowywać schemat (tj. Użyj https zamiast $ scheme). Dzieje się tak z tych samych powodów, dla których łącza zależne od
mahemoff
@mahemoff To nie do końca prawda. Rozważmy przypadek, w którym serwer sieciowy znajduje się za modułem równoważenia obciążenia, który rozładowuje protokół SSL.
Sebastian Neira,
11

To powinno działać przez HTTPRewriteModule .

Przykład przepisania z www.example.com na example.com:

server {    
    server_name www.example.com;    
    rewrite ^ http://example.com$request_uri? permanent; 
}
udo
źródło
to tylko przekierowanie www.example.com do example.com. Chcę przekierować obie strony do innej domeny. Czy mogę to zrobić w jednej regule?
debiut
Nie wiem na pewno, ale myślę, że nazwa_serwera moja_domena.com; przepisać www.adifferentdomain.com na stałe; } powinno to zrobić? To powinno zająć wszystko * .moja_domena.com?
udo
Po prostu miałbyś @deb server_name example.com www.example.com;.
citruspi
Pytanie dotyczy konkretnie wszystkich subdomen, które mają przekierowywać do innej domeny. Ta odpowiedź nie odpowiada żadnemu z dwóch (wyraźnie).
Kissaki,
brakuje ważnego 301!
Sliq
10

Jeśli chcesz przekierować żądania z „domena1.com” do „domena2.com”, możesz utworzyć blok serwera, który wygląda następująco:

server {
    listen 80;
    server_name domain1.com;
    return 301 $scheme://domain2.com$request_uri;
}
ZanMax
źródło
Ktoś może również potrzebować przekierowania żądania https: //. listen 443;
Rafik Farhad
1

Możesz po prostu napisać warunek if w bloku {} serwera:

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}
cryptoKTM
źródło
Musisz uważać, używając instrukcji „if” na Nginx ( nginx.com/resources/wiki/start/topics/depth/ifisevil ). W takim przypadku możesz po prostu użyć „nazwa_serwera moja_domena.com”.
Marty
jeśli jest zły, gdy jest używany w kontekście lokalizacji, jest bezpieczny, gdy jest używany do określenia hosta przekierowania
cryptoKTM
0

Tymczasowe przekierowanie

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

Trwałe przekierowanie

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

W pliku konfiguracyjnym nginx dla określonej witryny:

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

}
Taimoor Changaiz
źródło
0

Używam tego kodu w moich witrynach

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

        return 301 $scheme://newdomain.com$request_uri;
}
Tech
źródło