# mod_setenvif モジュール

このモジュールは、 リクエストの属性に基づいて環境変数を設定する機能を提供します。

ステータス: Base
ソースファイル: mod_setenvif.c
モジュール識別子: setenvif_module
互換性: Apache 1.3 以降で使用可能。

## 概要

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

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

>       BrowserMatch ^Mozilla netscape
>       BrowserMatch MSIE !netscape

詳細は、Apache の環境変数を参照してください。

## ディレクティブ

- BrowserMatch
- BrowserMatchNoCase
- SetEnvIf
- SetEnvIfNoCase

## BrowserMatch ディレクティブ

構文: BrowserMatch regex env-variable[=value] [env-variable[=value]] ...
デフォルト: None
コンテキスト: サーバ設定ファイル、バーチャルホスト、ディレクトリ、.htaccess
上書き: FileInfo
ステータス: Base
モジュール: mod_setenvif
互換性: Apache 1.2 以上 (このディレクティブは Apache 1.2 では、今では obsolete になっている mod_browser モジュールにありました)。.htaccess ファイルでの使用は 1.3.13 以降でのみサポート。

BrowserMatch ディレクティブは、HTTP リクエストの `User-Agent` ヘッダフィールドに基づいて環境変数を設定します。最初の引数は POSIX.2 拡張正規表現 (`egrep` 形式の正規表現と似たもの) です。 残りの引数は、設定をする変数名とその値で、後者は省略可能です。 これらは以下の形式になります。

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

最初の形式では、値は "1" に設定されます。 2 番目は変数が既に定義されていた場合、それを削除します。 3 番目は変数の値を `value` に設定します。 `User-Agent` フィールドの文字列が複数のエントリにマッチした場合は、 その結果がまとめられます。 エントリは現れた順に処理され、後のエントリが前のものを上書きします。

例:

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

正規表現の文字列は大文字小文字を区別することに注意してください。大文字小文字を区別しないマッチは`BrowserMatchNoCase`ディレクティブを参照してください。

`BrowserMatch` ディレクティブと `BrowserMatchNoCase` ディレクティブは `SetEnvIf` ディレクティブ `SetEnvIfNoCase` ディレクティブの特別なケースです。以下の 2 行は同じ効果になります:

       BrowserMatchNoCase Robot is_a_robot
       SetEnvIfNoCase User-Agent Robot is_a_robot

## BrowserMatchNoCase ディレクティブ

構文: BrowserMatchNoCase regex env-variable[=value] [env-variable[=value]] ...
デフォルト: none
コンテキスト: サーバ設定ファイル、バーチャルホスト、ディレクトリ、.htaccess
上書き: FileInfo
ステータス: Base
モジュール: mod_setenvif
互換性: Apache 1.2 以上 (このディレクティブは Apache 1.2 では、今では obsolete になっている mod_browser モジュールにありました)。.htaccess ファイルでの使用は 1.3.13 以降でのみサポート。

`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]] ...
デフォルト: none
コンテキスト: サーバ設定ファイル、バーチャルホスト、ディレクトリ、.htaccess
上書き: FileInfo
ステータス: Base
モジュール: mod_setenvif
互換性: Apache 1.3 以上。 Request_Protocol キーワードと環境変数のマッチは 1.3.7 以降でのみ使用可能。.htaccess ファイルでの使用は 1.3.13 以降でのみサポート。

`SetEnvIf` ディレクティブは、リクエストの属性に基づいて環境変数を定義します。 これらの属性は、HTTP リクエストのいろいろなヘッダフィールド (詳しい情報は RFC 2616 を参照してください) か、以下のような、リクエストの他の側面であることができます。

- `Remote_Host` - リクエストを行なっているクライアントのホスト名 (もしあれば)
- `Remote_Addr` - リクエストを行なっているクライアントの IP アドレス
- `Request_Method` - 使用されているメソッド名 (`GET`, `POST` など)
- `Request_Protocol` - リクエストが行なわれたプロトコルの名前とバージョン (例えば、"HTTP/0.9", "HTTP/1.1" など。)
- `Request_URI` - URL のスキームとホストの後の部分

よく使われるリクエストのヘッダフィールドには `Host`, `User-Agent`, `Referer` があります。

属性名 attribute が特別なキーワードやリクエストのヘッダフィールド名にマッチしないときは、 リクエストに関連付けられたリストにある環境変数の名前として試されます。 これにより、`SetEnvIf` ディレクティブが前のマッチの結果を使用することができるようになります。

> 前の `SetEnvIf[NoCase]` で定義された環境変数のみをこの方法で調べることができます。 「前」というのは (サーバ全体、のような) より広いスコープで定義されたか、 現ディレクティブのスコープの中の前の方で定義されたという意味です。

例:

       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\.com intra_site_referral
            :
       SetEnvIf object_is_image xbm XBIT_PROCESSING=1

先頭の三つはリクエストが画像ファイルのときに、環境変数 `object_is_image` を設定します。 4 番目は参照元のページが `www.mydomain.com` ウェブサイトのどこかにある場合に `intra_site_referral` を設定します。

## SetEnvIfNoCase ディレクティブ

構文: SetEnvIfNoCase attribute regex env-variable[=value] [env-variable[=value]] ...
デフォルト: none
コンテキスト: サーバ設定ファイル、バーチャルホスト、ディレクトリ、.htaccess
上書き: FileInfo
ステータス: Base
モジュール: mod_setenvif
互換性: Apache 1.3 以上。 Request_Protocol キーワードと環境変数のマッチは 1.3.7 以降でのみ使用可能。.htaccess ファイルでの使用は 1.3.13 以降でのみサポート。

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

       SetEnvIfNoCase Host Apache\.Org site=apache

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