web-dev-qa-db-ja.com

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

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

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

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

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

10
ranisalt

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;
}

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

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

最後に、returnディレクティブがリダイレクトの最良のアプローチであることに注意してください。リダイレクトにはrewriteを使用して Pitfalls に遭遇する可能性があります。

22
krisFR