Wie leite ich mit NGINX zu einer anderen Domain um?

136

Wie kann ich mydomain.comund jede Subdomain *.mydomain.comzur www.adifferentdomain.comVerwendung von NGINX umleiten ?

deb
quelle

Antworten:

276

Servername unterstützt Suffix-Übereinstimmungen mit der .mydomain.com-Syntax:

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

oder auf einer Version 0.9.1 oder höher:

server {
  server_name .mydomain.com;
  return 301 http://www.adifferentdomain.com$request_uri;
}
Kolbyjack
quelle
1
Muss ich keinen Port eingeben, um abzuhören? Beispiel: Hören Sie 80. Ich habe mehrere Domänen, die ich zu einer primären Domäne umleiten muss, aber mein Server verfügt auch über mehrere virtuelle Server für verschiedene andere Domänen.
Ryan
1
@Ryan Die listenDirektive verwendet standardmäßig Port 80, wenn nichts angegeben ist. Es ist tatsächlich etwas komplizierter als das im Allgemeinen; Weitere Informationen finden Sie in den Nginx-Konfigurationsdokumenten .
Yitz
2
Was erreicht das ?am Ende?
Dan Dascalescu
5
Was ist der Unterschied zwischen rewriteund return 301 $scheme://www.adifferentdomain.com$request_uri;?
Dan Dascalescu
6
Das ? Am Ende eines Umschreibens wird nginx angewiesen, die ursprüngliche Abfragezeichenfolge nicht anzuhängen. Da $request_uridie Abfragezeichenfolge bereits vorhanden ist, muss sie nicht erneut angehängt werden. Die return 301Syntax ist neuer und es sollte keinen Unterschied im Verhalten zwischen den beiden Methoden geben, aber als ich diese Frage ursprünglich beantwortete, hatten viele Distributionen nicht die erforderliche Version, also habe ich mich für die sicherere Syntax entschieden.
Kolbyjack
15

Warum das Rewrite-Modul verwenden, wenn Sie können return? Technisch gesehen returnist es Teil des Rewrite-Moduls, wie Sie hier lesen können, aber dieses Snippet ist imho einfacher zu lesen.

server {
    server_name  .domain.com;

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

Sie können ihm auch eine 301-Weiterleitung geben.

Robin van Baalen
quelle
1
Wird dies auch den Pfad und die Abfrageparameter beibehalten?
Mpen
3
Nein, dieses Beispiel macht das nicht @Mark. Aber ich nehme an, Sie können die vorherigen Antworten verwechseln, um so etwas zu finden:return 302 $scheme://forwarded-domain.com$request_uri;
Robin van Baalen
Nebenbei bemerkt, in vielen Fällen sollten Sie wahrscheinlich nur zu https umleiten, anstatt das Schema beizubehalten (dh https anstelle von $ Schema verwenden). Dies ist aus den gleichen Gründen, warum protokollbezogene Links jetzt als veraltet gelten - paulirish.com/2010/the-protocol-relative-url
mahemoff
@ Mahemoff Das stimmt nicht ganz. Stellen Sie sich den Fall vor, dass sich der Webserver hinter einem Loadbalancer befindet, der ssl entlädt.
Sebastian Neira
11

Das sollte über HTTPRewriteModule funktionieren .

Beispielumschreibung von www.example.com auf example.com:

server {    
    server_name www.example.com;    
    rewrite ^ http://example.com$request_uri? permanent; 
}
Du tust
quelle
Das leitet nur www.example.com zu example.com um. Ich möchte beide auf eine andere Domain umleiten. Kann ich das in einer Regel tun?
Deb
Ich weiß es nicht genau, aber ich denke, dass der Servername mydomain.com; www.adifferentdomain.com permanent umschreiben; } Sollte es tun? Das sollte alles dauern * .mydomain.com?
Udo
@deb hättest du nur server_name example.com www.example.com;.
Citruspi
In der Frage wird speziell gefragt, ob Subdomains zu einer anderen Domain umgeleitet werden sollen . Diese Antwort beantwortet keine der beiden (explizit).
Kissaki
Hier fehlt der wichtige 301!
Sliq
9

Wenn Sie Anforderungen für "domain1.com" an "domain2.com" umleiten möchten, können Sie einen Serverblock erstellen, der folgendermaßen aussieht:

server {
    listen 80;
    server_name domain1.com;
    return 301 $scheme://domain2.com$request_uri;
}
ZanMax
quelle
Möglicherweise muss jemand auch die https: // -Anforderung umleiten. listen 443;
Rafik Farhad
0

Temporäre Weiterleitung

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

Permanente Weiterleitung

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

In der Nginx-Konfigurationsdatei für eine bestimmte Site:

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

}
Taimoor Changaiz
quelle
0

Sie können einfach eine if-Bedingung in den Serverblock {} schreiben:

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}
cryptoKTM
quelle
Sie müssen vorsichtig sein, wenn Sie ' if' -Anweisungen in Nginx verwenden ( nginx.com/resources/wiki/start/topics/depth/ifisevil ). In diesem Fall können Sie stattdessen einfach 'Servername mydomain.com' verwenden.
Marty
Wenn es böse ist, wenn es im Standortkontext verwendet wird, ist es sicher, wenn es verwendet wird, um den Umleitungshost
cryptoKTM