Apache HTTP サーバ バージョン 2.4

Apache > HTTP サーバ > ドキュメンテーション > バージョン 2.4 > モジュール

# Apache モジュール mod_setenvif

この日本語訳はすでに古くなっている 可能性があります。 最近更新された内容を見るには英語版をご覧下さい。

説明: | リクエストの特徴に基づいた環境変数の設定を可能にする
ステータス: | Base
モジュール識別子: | setenvif_module
ソースファイル: | mod_setenvif.c

### 概要

`mod_setenvif` モジュールは、リクエストのある側面が指定された正規表現 に合うかどうかによって環境変数を設定する機能を提供します。 これらの環境変数を使用して、サーバの他の部分がどのような動作をするかを 決定することができます。

このモジュールが提供するディレクティブは、 設定ファイルに現れる順番に適用されます。 それを使って、次の例のようにより複雑な設定をすることができます。 これは、ブラウザが mozilla ではあるけれど、MSIE ではないときに `netscape` を設定します。

`BrowserMatch ^Mozilla netscape
BrowserMatch MSIE !netscape
`

### ディレクティブ

### Bugfix checklist

- httpd changelog
- Known issues
- Report a bug

### 参照

- Apache の環境変数

## BrowserMatch ディレクティブ

説明: | HTTP User-Agent に基づいて環境変数を設定する
構文: | `BrowserMatch regex [!]env-variable[=value] [[!]env-variable[=value]] ...`
コンテキスト: | サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
上書き: | FileInfo
ステータス: | Base
モジュール: | mod_setenvif

`BrowserMatch` は `SetEnvIf` ディレクティブの 特例で、`User-Agent` HTTP リクエストヘッダに基づいて 環境変数を設定します。以下の 2 行の効果は同じになります:

`BrowserMatchNoCase Robot is_a_robot
SetEnvIfNoCase User-Agent Robot is_a_robot
`

その他の例:

`BrowserMatch ^Mozilla forms jpeg=yes browser=netscape
BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript
BrowserMatch MSIE !javascript
`

## BrowserMatchNoCase ディレクティブ

説明: | HTTP User-Agent に基づいて大文字小文字を区別せずに 環境変数を設定する
構文: | `BrowserMatchNoCase regex [!]env-variable[=value] [[!]env-variable[=value]] ...`
コンテキスト: | サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
上書き: | FileInfo
ステータス: | Base
モジュール: | mod_setenvif

`BrowserMatchNoCase` ディレクティブは 意味的には `BrowserMatch` ディレクティブと 同じです。ただし、このディレクティブは大文字小文字を区別しない マッチングを行ないます。例えば:

`BrowserMatchNoCase mac platform=macintosh
BrowserMatchNoCase win platform=windows
`

`BrowserMatch` ディレクティブと `BrowserMatchNoCase` ディレクティブは `SetEnvIf` ディレクティブと `SetEnvIfNoCase` ディレクティブの 特例です。以下の 2 行の効果は同じです:

`BrowserMatchNoCase Robot is_a_robot
SetEnvIfNoCase User-Agent Robot is_a_robot
`

## SetEnvIf ディレクティブ

説明: | リクエストの属性に基づいて環境変数を設定する
構文: | `SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...`
コンテキスト: | サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
上書き: | FileInfo
ステータス: | Base
モジュール: | mod_setenvif

`SetEnvIf` ディレクティブは、リクエストの属性に基づいて環境変数を定義します。 最初の引数で指定できる attribute は以下の 4 つのどれかです:

1. HTTP リクエストヘッダフィールド (詳しい情報は RFC 2616 を 参照してください)。例えば、`Host`, `User-Agent`, `Referer`, `Accept-Language` です。リクエストヘッダの集合を現すために 正規表現を使うこともできます。
2. 以下のリクエストの一部分のどれか:
   - `Remote_Host` - リクエストを行なっているクライアントのホスト名 (もしあれば)
   - `Remote_Addr` - リクエストを行なっているクライアントの IP アドレス
   - `Server_Addr` - リクエストを受け取ったサーバの IP アドレス (2.0.43 以降のみ)
   - `Request_Method` - 使用されているメソッド名 (`GET`, `POST` など)
   - `Request_Protocol` - リクエストが行なわれたプロトコルの名前とバージョン (例えば、"HTTP/0.9", "HTTP/1.1" など。)
   - `Request_URI` - URL のスキームとホストの後の部分。 追加の情報として、クエリーストリングにマッチさせる場合については `RewriteCond` ディレクティブを参照してください。
3. リクエストと関連付けられる環境変数のリスト。これにより `SetEnvIf` ディレクティブが以前のマッチの結果を 使うことができるようになります。この方法のテストでは前の部分にある `SetEnvIf[NoCase]` の結果のみを使用可能です。「前」とは、 より広い範囲に対して定義されている (サーバ全体のように) か、現在のディレクティブの 範囲でより前の部分で定義されているか、ということです。 環境変数である可能性は、リクエストの特性に対するマッチが存在せず、 attribute に正規表現が使われなかったときにのみ考慮されます。
4. SSL クライアント証明書拡張への参照で、oid オブジェクト ID で指定されるもの。 SSL リクエストでない場合や oid が設定されていなかった場合は、 変数はセットされません。oid が複数見つかった場合は それらの文字列はカンマ `','` 区切りで連結されます。 oid は文字列型拡張への参照でなければなりません。

二つ目の引数 (regex) は 正規表現です。 これは POSIX.2 の egrep 形式の正規表現と似ています。regex が attribute にマッチする場合は、残りの引数が評価されます。

残りの引数は設定する変数の名前で、設定される値を指定することもできます。 これは、

1. `varname`
2. `!varname`
3. `varname=value`

のどれかの形式になります。

最初の形式では、値は "1" に設定されます。 二つ目はもし値が定義されていればそれを取り除きます。 三つ目は変数を `value` の与えられた値に設定します。 2.0.51 以降では、value 内に `$1`..`$9` が存在すればそれを認識し、regex の対応する丸括弧で囲まれた部分で 置換します。

### 例:

`SetEnvIf Request_URI "\.gif$" object_is_image=gif
SetEnvIf Request_URI "\.jpg$" object_is_image=jpg
SetEnvIf Request_URI "\.xbm$" object_is_image=xbm
:
SetEnvIf Referer www\.mydomain\.example\.com intra_site_referral
:
SetEnvIf object_is_image xbm XBIT_PROCESSING=1
:
SetEnvIf OID("2.16.840.1.113730.1.13") "(.*)" NetscapeComment=$1
:
SetEnvIf ^TS* ^[a-z].* HAVE_TS
`

初めの三つはリクエストが画像であるときに環境変数 `object_is_image` を設定します。四つ目は 参照元のページがウェブサイト `www.mydomain.example.com` にあるときに `intra_site_referral` を設定します。

6番目の例では環境変数 `NetscapeComment` を定義して、 その値が SSL クライアント証明書の対応するフィールドの文字列であるようにします。 ただし SSL クライアント証明書の対応するフィールドに文字列が存在する ときにのみ、環境変数は設定されます。

最後の例は、リクエストに "TS" で始まり、値が集合 [a-z] のどれかで 始まるヘッダがあるときに `HAVE_TS` を設定します。

### 参照

- 他の例は、Apache の環境変数

## SetEnvIfExpr ディレクティブ

説明: | Sets environment variables based on an ap_expr expression
構文: | ``
コンテキスト: | サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
ステータス: | Base
モジュール: | mod_setenvif

Documentation not yet translated. Please see English version of document.

## SetEnvIfNoCase ディレクティブ

説明: | リクエストの属性に基づいて大文字小文字を区別せずに環境変数を設定する
構文: | `SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...`
コンテキスト: | サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
上書き: | FileInfo
ステータス: | Base
モジュール: | mod_setenvif

`SetEnvIfNoCase` は意味的には `SetEnvIf` ディレクティブと 同じです。違いは、正規表現のマッチングが大文字小文字を区別しないで 行なわれることです。例えば:

`SetEnvIfNoCase Host Apache\.Org site=apache`

これは HTTP リクエストヘッダにフィールド `Host:` が あり、その値が `Apache.Org` や `apache.org`、 その他の大文字小文字の組み合わせであったときに `site` 環境変数を "`apache`" に設定します。