web-dev-qa-db-ja.com

nginxの正規表現を使用してサブドメインをリダイレクトする

Nginxのドキュメントには、 server_nameディレクティブ が正規表現をサポートしていると記載されています。些細な正規表現でさえも機能させようとして、壁に頭をぶつけてきました。

http://subdomain.mydomain.com にリダイレクトしたい http://mydomain.com/subdomain

これが私のコードです。

server {
  server_name "~^subdomain\.mydomain\.com$";
  rewrite ^ http://mydomain.com/subdomain;
}

また、潜在的に注目に値する。 nginx構成ファイルのさらに下には、次のルールがあります。

server {
  server_name *.mydomain.com
  ...
}

私は何が間違っているのですか?

更新:

これには正規表現を使用しないことをお勧めします...もう少し明確にするために、些細な正規表現は単にトラブルシューティングを目的としたものです。実際の正規表現は次のようになります...

server {
  server_name "~^.*(cvg|cincinnati)\.fakeairport(app)?\.(org|com)$";
  rewrite ^ http://fakeairport.com/cincinnati;
}

server {
  server_name "~^.*(Lex|lexington)\.fakeairport(app)?\.(org|com)$";
  rewrite ^ http://fakeairport.com/lexington;
}

したがって、正規表現を使用することをお勧めします。

15
danott

他の人を助けるために古い質問に答えるために

nginx 1.1.19を使用すると、次のことができます。

server {
    server_name     ~^(?<subdomain>\w+)\.domainA\.com$;

    location / {
            rewrite ^ https://$subdomain.domainB.com$request_uri permanent;
    }
}

DomainA.comの前のサブドメインが照合され、変数$ subdomainに保存されます。これは、書き換えに使用できます。これにより、サーバーディレクティブが1つだけで、xxx.domainA.comのようなURLがxxx.domainB.comに書き換えられます。

31
Bart

NGINXで正規表現が大好きです!

私は複数のドメイン名を使用することが多く、構成をできるだけクリーンで堅固に保つのが好きなので、ほとんどの場合、nginxで正規表現を使用します。

この場合、次の正規表現で解決しました。

server {
    listen 80;
    server_name ~^((?<subdomain>.*)\.)(?<domain>[^.]+)\.(?<tld>[^.]+)$;
    return 301 $scheme://${domain}.${tld};
}

これは次のようになります。このサーバー(IPアドレス)を指すすべてのsubdomain.domain-name.tldは自動的にdomain-name.tldにリダイレクトされます。

したがって、たとえばwww.myexampledomain.commyexampledomain.comにリダイレクトされます。

質問に答えるために、あなたができることは次のとおりです。

server {
    listen 80;
    server_name ~^((?<subdomain>.*)\.)(?<domain>[^.]+)\.(?<tld>[^.]+)$;
    return 301 $scheme://${domain}.${tld}/${subdomain};
}

これで、mysubdomain.myexampledomain.commyexampledomain.com/mysubdomainに変換されます。

上記の正規表現は、好きなものを何でも投げることができ、変換されるので素晴らしいです。

12
Ottonet

server_nameマッチングルール を読むと、プレフィックスとサフィックスのserver_namesが正規表現名の前にチェックされますが、正確なホスト名の後にチェックされていることがわかります。 * .mydomain.comが一致するため、正規表現はテストされません。構成の前半にリストされているという事実は、違いはありません。単一のホスト名を正規表現と一致させようとしているだけなので、簡単です。

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

server {
  server_name *.mydomain.com;

  # stuff
}

あなたのために働きます。

5
kolbyjack

コメントとして。すべてのサブドメインレベルを最初のサブドメインレベルにリダイレクトする場合、たとえばワイルドカードSSL証明書を使用する場合はutilを使用すると、次のようになります。

server {
    listen 80;
    server_name ~^(.*)\.(?<subdomain>\w+).mydomain\.com$;
    return          301 https://$subdomain.mydomain.com$request_uri; 
}

server {
    listen 80;
    server_name ~^(?<subdomain>\w+).mydomain\.com$;
    return          301 https://$subdomain.mydomain.com$request_uri;
}

1つ目は、httpマルチレベルサブドメインをhttpsの最初のサブドメインレベルにリダイレクトするためのものです。次は、httpの第1レベルのサブドメインをhttpsの同じサブドメインにリダイレクトするためのものです。

1
Harry Martel

Nginxの設定ファイルで悪かったと誰もが言っていることは知っていますが、他の方法で回避できない場合もあります。

server {
      server_name .mydomain.com;

      if ( $Host ~ subdomain.mydomain.com ) {
                rewrite ^(.*) http://mydomain.com/subdomain$1;
      }
}
1
petermolnar