条件分岐の使い方(ifディレクティブ)
Nginx では、 if ディレクティブを使用することでリクエストの内容などに応じて処理を分岐することができます。ここでは Nginx で if ディレクティブを使った条件分岐の方法について解説します。
ifディレクティブの書式
Nginx の if ディレクティブを使用すると、条件が true になった場合にだけ実行する処理を記述することができます。 if ディレクティブの書式は次の通りです。
Syntax: if (condition) { ... }
Default: —
Context: server, location
if ディレクティブは server コンテキストまたは location コンテキストに記述します。
括弧 ( ) の中に記述した条件が真(true)の場合に、ブロック内の処理が実行されます。
if (条件) {
# ・・・
}
※ 条件が偽の場合に実行する else のような構文はありません。また、一般的なプログラミング言語のように AND や OR を使って複数の条件を直接組み合わせることはできません。
「条件」は次の演算子を使って記述します。
変数と文字列が等しい(または等しくない)=(!=) 正規表現にマッチする(マッチしない)~(!~) 正規表現にマッチする(マッチしない)※大文字小文字を区別しない~*(!~*) ファイルが存在する(または存在しない)-f(!-f) ディレクトリが存在する(または存在しない)-d(!-d) ファイル、ディレクトリ、シンボリックリンクのいずれかが存在する(または存在しない)-e(!-e) 実行可能なファイルが存在する(または存在しない)-x(!-x)
なお if ディレクティブは location コンテキスト内で使用すると予期しない結果になることがあります。 location 内で if ディレクティブを利用する場合は、ブロック内の処理は return または rewrite のみを使用されるようにしてください。
if ディレクティブを使用する場合は、想定した通りに動作するかどうかを十分に確認してください。また、他のディレクティブで代替できないかもあわせて検討することをおすすめします。
条件にユーザー定義変数を記述した場合
条件のところにユーザー定義変数だけを記述する場合があります。
set $myvar "Ok";
if ($myvar) {
# ・・・
}
変数に設定されている値が空文字列("")または "0" の場合は偽となります。それ以外の文字列が設定されている場合は真となります。
※ 変数に設定される値は数値ではなくすべて文字列なので、 "0" ではない "00" などは真となります。
ifディレクティブの設定例
if ディレクティブの設定例をいくつか見ていきます。
http {
server {
if ($host = 'example.com') {
return 301 https://www.example.com$request_uri;
}
}
}
組み込み変数の $host の値が "example.com" と等しい場合、"www" を付けた "www.example.com" へ 301 リダイレクトしています。
http {
server {
if ($http_user_agent ~* "(Android|iPhone|iPad)") {
return 301 https://m.example.com$request_uri;
}
}
}
組み込み変数の $http_user_agent の値が "Android"、"iPhone"、"iPad" のいずれかにマッチした場合、モバイル向けの "m.example.com" へ 301 リダイレクトします。
※ 実際には User-Agent による判定は完全ではないため、実際の運用では注意が必要です。
-- --
Nginx で if ディレクティブを使った条件分岐の方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。