web-dev-qa-db-ja.com

nginx.confは複数の条件をリダイレクトします

Nginxを使用して2つの条件でリクエストをリダイレクトしたい。

これは機能しません:

  if ($Host = 'domain.com' || $Host = 'domain2.com'){
    rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
  }   

これを行う正しい方法は何ですか?

47
mark

以前にも同じ問題がありました。 nginxは複雑な条件やネストされたifステートメントを実行できないため、2つ以上の異なる式を評価する必要があります。

変数をバイナリ値に設定し、2つの異なるifステートメントでいずれかの条件が真の場合に有効にします。

set $my_var 0;
if ($Host = 'domain.com') {
  set $my_var 1;
}
if ($Host = 'domain2.com') {
  set $my_var 1;
}
if ($my_var = 1) {
  rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
}   
84
Chris Barretto

正しい方法は、リダイレクトに専用サーバーを使用することです。

server {
  server_name domain.com domain2.com;
  rewrite ^ http://www.domain.com$request_uri? permanent;
}
21
kolbyjack

宣言的なアプローチは次のとおりです。

server {
    listen       80;
    server_name  domain.com domain2.com;
    return 301 $scheme://www.domain.com$uri;    
}

server {
    listen       80  default_server;
    server_name  _;
    #....
}
5
Cole Tierney

別の可能性は

server_name domain.com domain2.com;
set $wanted_domain_name domain.com;
if ($http_Host != $wanted_domain_name) {
    rewrite  ^(.*)$  https://$wanted_domain_name$1;
}

そのため、すべてを特定の1つにリダイレクトしますが、ユースケースに基づいています

5
shadowdroid

複数のドメインを単一のドメインに書き換え、ブラウザでのループ状態を回避します。

server {
    listen       80;
    server_name  www.wanted_domain.com wanted_domain.com www.un_wanted_domain.com un_wanted_domain.com;
    if ($Host = 'un_wanted_domain.com'){
       return 301 $scheme://www.wanted_domain.com$request_uri;
    }
    if ($Host = 'www.un_wanted_domain.com'){
       return 301 $scheme://www.wanted_domain.com$request_uri;
    }
4
David

それを行う最も簡単な方法は、正規表現を使用することだと思います:

if ($Host ~ "domain.com|domain2.com") {
    rewrite ^/(.*)$ http://www.example.com/$1 permanent;
}

ただし、文字列しかない場合にのみ有効です。複雑なロジックの場合、それは間違いです。

1