Nginxを使用して2つの条件でリクエストをリダイレクトしたい。
これは機能しません:
if ($Host = 'domain.com' || $Host = 'domain2.com'){
rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
}
これを行う正しい方法は何ですか?
以前にも同じ問題がありました。 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;
}
正しい方法は、リダイレクトに専用サーバーを使用することです。
server {
server_name domain.com domain2.com;
rewrite ^ http://www.domain.com$request_uri? permanent;
}
宣言的なアプローチは次のとおりです。
server {
listen 80;
server_name domain.com domain2.com;
return 301 $scheme://www.domain.com$uri;
}
server {
listen 80 default_server;
server_name _;
#....
}
別の可能性は
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つにリダイレクトしますが、ユースケースに基づいています
複数のドメインを単一のドメインに書き換え、ブラウザでのループ状態を回避します。
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;
}
それを行う最も簡単な方法は、正規表現を使用することだと思います:
if ($Host ~ "domain.com|domain2.com") {
rewrite ^/(.*)$ http://www.example.com/$1 permanent;
}
ただし、文字列しかない場合にのみ有効です。複雑なロジックの場合、それは間違いです。