Apache HTTP サーバ バージョン 2.2
Apache モジュール mod_headers
説明: | HTTP リクエストのヘッダと応答のヘッダのカスタマイズ |
---|---|
ステータス: | Extension |
モジュール識別子: | headers_module |
ソースファイル: | mod_headers.c |
概要
このモジュールは HTTP のリクエストヘッダと応答ヘッダを制御し、 変更するためのディレクティブを提供します。ヘッダを追加したり、 置き換えたり、削除したりすることができます。
処理の順番
mod_header
のディレクティブはサーバ設定のほぼどこにでも
書くことができ、影響する範囲を設定用セクションで囲むことで限定する
ことができます。
処理の順番は重要で、設定ファイル中の順番と、設定用セクション内の位置との両方に 影響されます。以下の二つのヘッダは順番が逆になると 違う結果になります:
RequestHeader append MirrorID "mirror 12"
RequestHeader unset MirrorID
この順番の場合は、MirrorID
ヘッダは設定されません。
逆になっていると、MirrorID ヘッダは "mirror 12" に設定されます。
早期処理、後期処理
mod_headers
では、リクエストの早期か後期かの
どちらで適用するかを選べます。通常は後期モードで、
コンテンツ生成が実行される直前にリクエストヘッダがセットされ、
レスポンスとして送出される直前にレスポンスヘッダがセットされます。
運用中のサーバでは必ず後期モードを使ってください。
早期モードは開発者向けのテスト/デバッグ用に設計されています。
early
キーワード指定されたディレクティブによって、
リクエスト処理の開始地点になります。
つまり、異なるリクエストを試したりテストケースをセットアップするのに
活用できる一方で、レスポンスを生成する前に他のモジュールによって
ヘッダが書き換えられてしまうかもしれないということを意味します。
early ディレクティブではリクエストパスの設定が解決される前に
処理されるので、メインサーバかバーチャルホストコンテキストでのみ、
早期ヘッダをセットできます。early ディレクティブはリクエストパスに
依存することはできませんので、<Directory>
や
<Location>
といったコンテキスト内では使用
できません。
例
- リクエストヘッダ中の "TS" で始まるフィールドをすべて応答ヘッダに
コピーします:
Header echo ^TS
-
リクエストを受け付けた時刻とリクエストを処理した時間を入れたヘッダ、
MyHeader
を応答に追加します。このヘッダはクライアントが サーバの負荷を直観的に知るためや、クライアント-サーバ間の ボトルネックを調べるために使うことができます。Header add MyHeader "%D %t"
上記の設定では、以下のようなヘッダが応答に追加されることになります:
MyHeader: D=3775428 t=991424704447256
-
Joe にあいさつをします:
Header add MyHeader "Hello Joe. It took %D microseconds for Apache to serve this request."
以下のようなヘッダが応答に追加されることになります
MyHeader: Hello Joe. It took D=3775428 microseconds for Apache to serve this request.
- リクエストに "MyRequestHeader" があるときに限り
MyHeader
を応答に 付けます。これは、クライアントの要求に応えてヘッダを作成するときに 役に立ちます。この例ではmod_setenvif
モジュールが必要なことに 注意してください。SetEnvIf MyRequestHeader value HAVE_MyRequestHeader
Header add MyHeader "%D %t mytext" env=HAVE_MyRequestHeaderもし HTTP リクエストに
MyRequestHeader: value
ヘッダが あると、応答には以下のようなヘッダが付加されます。MyHeader: D=3775428 t=991424704447256 mytext
Header ディレクティブ
説明: | HTTP 応答ヘッダの設定 |
---|---|
構文: | Header [condition] set|append|add|unset|echo
header [value] [early|env=[!]variable] |
コンテキスト: | サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess |
上書き: | FileInfo |
ステータス: | Extension |
モジュール: | mod_headers |
このディレクティブは HTTP 応答ヘッダを置換、追加、削除できます。 ヘッダはコンテントハンドラや出力フィルタが実行された直後に実行され、 出て行くヘッダを変更できるようになっています。
オプションの condition は onsuccess
か
always
のどちらかを指定できます。これは内部ヘッダテーブルのどれを
操作するかを決定します。onsuccess
は 2xx
ステータスコードの、always
は全てのステータスコード
(2xx
を含む) の意味になります。
あるモジュールでセットされるヘッダをアンセットしたい場合は特に、
どのテーブルが影響を受けるかを実際に試したほうがよいでしょう。
行なう処理は二番目のの引数で決まります。 この引数には次の値を指定できます:
set
- 応答ヘッダを設定します。同じ名前のヘッダが存在する場合はそれを 置き換えます。value にはフォーマット文字列を 指定することもできます。
append
- 応答ヘッダを既に存在する同じ名前のヘッダに追加します。 新しい値が既存のヘッダに追加されるときには、既存のヘッダの 後にコンマで区切られて追加されます。これはヘッダに複数の値を 指定するときの HTTP の標準の方法です。
add
- ヘッダが既に存在しているときでさえも、応答ヘッダを
既存のヘッダに追加します。これにより、二つ (かそれ以上) の
ヘッダの名前が同じになることがあります。その結果、想定できない
ことが起こる可能性がありますので、一般的には
append
の方を 使う方が良いでしょう。 unset
- もし指定された名前の応答ヘッダが存在していれば、削除されます。 同じ名前のヘッダが複数あるときは、すべて削除されます。 value をつけてはいけません。
echo
- 指定されたものと同じ名前のリクエストヘッダを応答ヘッダで そのまま返します。header には正規表現も指定できます。 value をつけてはいけません。
この引数の後にはヘッダ名 (header) が続きます。
ヘッダ名には最後にコロンを含めることもできますが、無くても構いません。
set
, append
, add
,
unset
では大文字小文字は
区別されません。echo の header 名は大文字小文字を区別し、
正規表現を指定することもできます。
add
, append
,
set
では value を三つ目の
引数として指定します。value に空白がある場合は二重引用符で
囲む必要があります。value は文字のみからなる文字列、
フォーマット指示子を含む文字列、もしくは両方からなる文字列を指定できます。
value は以下のフォーマット指示子をサポートします:
フォーマット | 解説 |
---|---|
%% |
パーセント記号 |
%t |
リクエストを受け取った時刻を、
Universal Coordinated Time での始まりの時刻 (Jan. 1, 1970) から経過した
時間をマイクロ秒として表したもの。値の最初には
t= が付加されます。 |
%D |
リクエストを受け取った時刻と、ヘッダを送り出した
時間との差。これは、リクエストが存在していた期間を表します。
値の最初には D= が付加されます。 |
%{FOOBAR}e |
環境変数
FOOBAR の値です。 |
%{FOOBAR}s |
mod_ssl が有効な場合、
SSL 環境変数 FOOBAR
の内容 |
注
%s
フォーマット指定子は 2.1 以降でのみ利用できます。
SSLOptions +StdEnvVars
を有効にすることによるオーバーヘッドを
避けるため、%e
の代わりとして使えます。
他の理由などがあって、どうしても SSLOptions +StdEnvVars
を有効にしなければならない場合は、%e
のほうが
%s
よりも処理効率は良いです。
Header
ディレクティブには追加の引数を持たせることが
できて、どういったアクションが行われたかの条件を指定したり、
早期処理 を指定する early
キーワードを
指定できます。
env=...
引数で指定された 環境変数 が存在する (もしくは env=!...
が指定されていて環境変数が存在しない) 場合は、Header
ディレクティブで指定された動作が行なわれます。そうでない場合は、
ディレクティブはそのリクエストには何もしません。
早期処理モードの場合以外では、
Header
ディレクティブは応答がネットワークに送られる直前に
処理されます。これは、ヘッダフィルタにより追加されるヘッダを
除き、ほとんどのヘッダを設定したり上書きしたりすることが
可能、ということです。
RequestHeader ディレクティブ
説明: | HTTP リクエストヘッダの設定 |
---|---|
構文: | RequestHeader set|append|add|unset header
[value] [early|env=[!]variable] |
コンテキスト: | サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess |
上書き: | FileInfo |
ステータス: | Extension |
モジュール: | mod_headers |
このディレクティブは HTTP リクエストヘッダを置換、追加、削除できます。 ヘッダはコンテントハンドラが実行される直前に実行され、 入って来るヘッダを変更することが可能になっています。 行なう処理は第 1 引数により決まります。これには以下の値を指定 することができます:
set
- リクエストヘッダを設定します。同じ名前のヘッダが存在していると、 それを置き換えます。
append
- リクエストヘッダは、既に存在する同じ名前のヘッダに追加されます。 新しい値が既存のヘッダに追加されるときには、既存のヘッダの 後にコンマで区切られて追加されます。これはヘッダに複数の値を 指定するときの HTTP の標準の方法です。
add
- ヘッダが既に存在しているときでさえも、リクエストヘッダを
既存のヘッダに追加します。これにより、二つ (かそれ以上) の
ヘッダの名前が同じになることがあります。その結果、想定できない
ことが起こる可能性がありますので、一般的には
append
の方を 使う方が良いでしょう。 unset
- もし指定された名前のリクエストヘッダが存在していれば、削除されます。 同じ名前の複数のヘッダがあるときは、すべて削除されます。 value をつけてはいけません。
この引数の後にはヘッダ名 (header) が続きます。
ヘッダ名には最後にコロンを含めることもできますが、無くても構いません。
大文字小文字は区別されません。add
,
append
, set
の場合は、value が三つ目の
引数として指定されます。value に空白がある場合は二重引用符で
囲む必要があります。unset の場合は、value は指定しません。
value は文字列、フォーマット指定子、あるいは、その混合です。
使うことのできるフォーマット指定子は、Header
と同じですので、
詳細はそちらをご覧ください。
RequestHeader
ディレクティブは、
どういった条件下でアクションを行うかを指定する追加引数
あるいは、早期処理 を指定する early
キーワードを設定することができます。
env=...
の引数で設定されている
環境変数 が存在している
(あるいは env=!...
で指定された環境変数が
存在しない) 場合、RequestHeader
ディレクティブは
有効になります。それ以外の場合、ディレクティブは効力を持ちません。
early モードでない場合に限り、
RequestHeader
ディレクティブは
fixup フェーズでリクエストがハンドラに扱われる直前に
処理されます。これにより、ブラウザや Apache の入力フィルタにより
生成されたヘッダを上書きしたり修正したりできるようになっています。