Nginx leitet alle alten Domain-Subdomains auf neue um

10

Ich hatte eine sehr lange Domain und beschloss, sie in eine kürzere und freundlichere zu ändern. Da ich jedoch viele Subdomains habe (tatsächlich habe ich einen Subdomain-Platzhalter), wollte ich die Subdomain beibehalten und nur den Domain-Teil ändern. Also habe ich folgende Regel aufgestellt:

server {
  listen 80;
  server_name ~^(\w+)\.olddomain\.com$;

  rewrite ^ $scheme://$1.doma.in$request_uri? permanent;
}

Ich habe viele andere Fragen gelesen, bei denen dieses Snippet das Problem gelöst hat. Bei mir leitet Nginx jedoch immer .domain.inohne Subdomains weiter. Was vermisse ich? Ich habe den regulären Ausdruck gegen den regulären Ausdruck 101 getestet und die Beispiele funktionieren einwandfrei. Nginx scheint nicht in der Lage zu sein, ihn umzuleiten.

Ranisalt
quelle

Antworten:

22

Seit nginx 0.8.25 können benannte Captures in Servername verwendet werden. Sie sollten sie verwenden.

Hier wird die Subdomain in einer Variablen namens gespeichert $sub. Dann können Sie es in der rewriteRichtlinie wiederverwenden :

server {
  listen 80;
  server_name ~^(?<sub>\w+)\.olddomain\.com$;
  rewrite ^ $scheme://$sub.doma.in$request_uri? permanent;
}

Alternativ können Sie Ihren tatsächlichen Regex behalten und $1in einer returnDirektive verwenden:

server {
  listen 80;
  server_name ~^(\w+)\.olddomain\.com$;
  return 301 $scheme://$1.doma.in$request_uri;
}

Beachten Sie schließlich, dass die returnRichtlinie der beste Ansatz für eine Umleitung ist. Sie können auf Fallstricke stoßen , wenn Sie rewriteeine Umleitung verwenden.

krisFR
quelle
Perfekt. Ich habe den Return-Ansatz verwendet, aber immer noch den Regex-Teil genannt. Er ist viel einfacher zu verstehen.
Ranisalt
Was ist, wenn wir auch ohne Subdomain (www) umleiten möchten? wie: sub1.ex.to> sub1.new.in und ex.to> www.new.in?
R. Canser Yanbakan
1
Beachten Sie, dass '\ w' nicht mit bestimmten Zeichen übereinstimmt, die in Domänennamen enthalten sein können, z. B. '-'. Die obige regex wird daher umleiten test-sub.doma.inzu .domai.in!
Wolfgang
Verwendung [\ w \ - \ _] + anstelle von \ w + für Domänen haben - und _ in ihnen
Sajjad Ashraf
Was macht ~die Regex am Anfang? Es macht nicht, da etwas vorher ^in Regex erscheinen würde .
hobbes3