Nginxはすべての古いドメインサブドメインを新しいドメインにリダイレクトします


10

私は非常に長いドメインを持っていたので、それをより短くよりフレンドリーなドメインに変更することにしました。しかし、私は多くのサブドメインを持っているので(実際、私はサブドメインのワイルドカードを持っています)、ドメイン部分のみを変更しながらサブドメインを保持したいと考えました。だから、私は次のルールを作りました:

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

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

このスニペットが問題を解決した他の多くの質問を読みました。しかし、私と一緒に、Nginxは常に.domain.inサブドメインなしでにリダイレクトします。何が欠けていますか?私はregex101に対してregexをテストしましたが、例は正常に動作し、Nginxはリダイレクトできません。

回答:


22

nginx 0.8.25以降、名前付きキャプチャはserver_nameで使用できます。それらを使用する必要があります。

ここでは、サブドメインはという変数に格納されます$sub。その後、それをrewriteディレクティブで再利用できます。

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

または、実際の正規表現を保持$1してreturnディレクティブで使用することもできます。

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

最後に、このreturnディレクティブはリダイレクトに最適な方法です。リダイレクトを使用してピットフォールに遭遇する可能性がありますrewrite


完璧です。私はreturnアプローチを使用しましたが、それでも正規表現の部分に名前を付けたので、はるかに理解しやすくなっています。
ラニサルト2014年

サブドメイン(www)なしでリダイレクトしたい場合はどうなりますか?例:sub1.ex.to> sub1.new.inおよびex.to> www.new.in?
R.キャンサーヤンバカン2015年

1
「\ w」は、ドメイン名に含めることができる特定の文字、たとえば「-」と一致しないことに注意してください。したがって、上記の正規表現は!にリダイレクトさtest-sub.doma.in.domai.inます。
Wolfgang

サブドメインに-および_が含まれているサブドメインには、\ w +の代わりに[\ w \-\ _] +を使用します
Sajjad Ashraf

~初めに正規表現では何をしますか?何かが以前^に正規表現で現れるので、それは作りません。
hobbes3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.