SetEnvIfディレクティブ:リクエストに含まれる情報に基づいて環境変数を設定する

SetEnvIf ディレクティブはクライアントからのリクエストに含まれるリファラーや User Agent などの属性が、正規表現を使って指定した属性値とマッチした場合に環境変数を設定する場合に使用します。ここでは Apache の SetEnvIf ディレクティブの使い方について解説します。

(Last modified: )

SetEnvIfディレクティブの使い方

SetEnvIf ディレクティブはリクエストに含まれる属性が別途指定した正規表現を使った属性値とマッチした場合に環境変数を定義します。書式は次のとおりです。

SetEnvIf 属性 属性値 [!]環境変数[=値]

記述できる場所は httpd.conf, VirtualHost, Directory, .htaccess です。 .htaccess で設定する場合は AllowOverride FileInfo が設定されている必要があります。

属性として指定できる値には、 HTTP リクエストヘッダ( Referer や User-Agent など)やリクエストの一部の情報を表す次のようなものを指定できます。

・Remote_Host  クライアントのホスト名
・Remote_Addr  クライアントのIPアドレス
・Server_Addr  サーバのIPアドレス
・Request_Method HTTP リクエストメソッド(GET、POSTなど)
・Request_Protocol プロトコル名(HTTP/1.1 など)
・Request_URI  リクエストのURI

属性値は正規表現を使った値を指定します。例えばクライアントの IP アドレスを表す Remote_Addr が指定の IP アドレスとマッチした場合に環境変数を設定する場合は次のように記述します。

SetEnvIf Remote_Addr "192\.168\.2\.12" client

※ 正規表現の記述方法については「正規表現入門」を参照されてください。

属性が属性値とマッチした場合、(1)指定した環境変数を定義する(値として 1 を設定する)、(2)指定した環境変数の定義を解除する、(3)指定した環境変数に指定の値を設定する、のいずれかの処理を行います。

(1) 環境変数
(2) !環境変数
(3) 環境変数=値

例えばクライアントの IP アドレスを表す Remote_Addr が指定の IP アドレスとマッチした場合に環境変数 client に値 abc を設定するには次のように記述します。

SetEnvIf Remote_Addr "192\.168\.2\.12" client=abc

環境変数は、他のディレクティブの設定の中で環境変数が定義されていたらこれを行うといった処理で利用することができます。

SetEnvIf ディレクティブが httpd.conf ファイルの中で複数記述さえていた場合、記述された順番で適用されていきます。同じ属性に対して複数の SetEnvIF ディレクティブを記述して環境変数を設定したり、先に記述した SetEnvIF ディレクティブによって定義された環境変数を、後から記述した SetEnvIF ディレクティブによって定義を解除したりすることができます。

例えばクライアントの IP アドレスが 192.168.2 で始まるアドレスだった場合は環境変数 client を定義しますが、 192.168.2.100 だった場合だけ環境変数 client の定義を解除する場合は次のように記述します。

SetEnvIf Remote_Addr "192\.168\.2\." client
SetEnvIf Remote_Addr "192\.168\.2\.100" !client

SetEnvIfディレクティブの利用例

SetEnvIf ディレクティブを使った環境変数の定義の例をいくつか掲載します。

[例] リクエスト URI の末尾が .webp または .jpeg だった場合に環境変数を定義する。

SetEnvIf Request_URI "\.(png|jpeg)$" image_file

[例] リファラーに www.example.com が含まれている場合に環境変数を定義する。

SetEnvIf Referer "www\.example\.com" my_site

[例] ユーザーエージェントに iPhone や iPad または Android が含まれている場合に環境変数を定義する。

SetEnvIf User-Agent "(iPhone|iPad)" ua=apple
SetEnvIf User-Agent "Android" ua=google

[例] プロキシ経由でのアクセスの場合などにクライアントの IP アドレスが 192.168.2.100 だったら環境変数を定義する。

SetEnvif X-Forwarded-For "192\.168\.2\.100" deny_user

[例] Cookie で xxx の値が yyy の場合に環境変数を設定する。

SetEnvif Cookie "xxx=yyy" user

[例] HTTP リクエストメソッドが GET または PUT の場合に環境変数を設定する

SetEnvif Request_Method "(PUT|GET)" method

-- --

Apache の SetEnvif ディレクティブの使い方について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。