mod_headers - Apache HTTP サーバ バージョン 2.2

Apache Server 2.2

<-

Apache モジュール mod_headers

この日本語訳はすでに古くなっている 可能性があります。 最近更新された内容を見るには英語版をご覧下さい。
説明:HTTP リクエストのヘッダと応答のヘッダのカスタマイズ
ステータス:Extension
モジュール識別子:headers_module
ソースファイル:mod_headers.c

概要

このモジュールは HTTP のリクエストヘッダと応答ヘッダを制御し、 変更するためのディレクティブを提供します。ヘッダを追加したり、 置き換えたり、削除したりすることができます。

top

処理の順番

mod_header のディレクティブはサーバ設定のほぼどこにでも 書くことができ、影響する範囲を設定用セクションで囲むことで限定する ことができます。

処理の順番は重要で、設定ファイル中の順番と、設定用セクション内の位置との両方に 影響されます。以下の二つのヘッダは順番が逆になると 違う結果になります:

RequestHeader append MirrorID "mirror 12"
RequestHeader unset MirrorID

この順番の場合は、MirrorID ヘッダは設定されません。 逆になっていると、MirrorID ヘッダは "mirror 12" に設定されます。

top

早期処理、後期処理

mod_headers では、リクエストの早期か後期かの どちらで適用するかを選べます。通常は後期モードで、 コンテンツ生成が実行される直前にリクエストヘッダがセットされ、 レスポンスとして送出される直前にレスポンスヘッダがセットされます。 運用中のサーバでは必ず後期モードを使ってください。

早期モードは開発者向けのテスト/デバッグ用に設計されています。 early キーワード指定されたディレクティブによって、 リクエスト処理の開始地点になります。 つまり、異なるリクエストを試したりテストケースをセットアップするのに 活用できる一方で、レスポンスを生成する前に他のモジュールによって ヘッダが書き換えられてしまうかもしれないということを意味します。

early ディレクティブではリクエストパスの設定が解決される前に 処理されるので、メインサーバかバーチャルホストコンテキストでのみ、 早期ヘッダをセットできます。early ディレクティブはリクエストパスに 依存することはできませんので、<Directory><Location> といったコンテキスト内では使用 できません。

top

  1. リクエストヘッダ中の "TS" で始まるフィールドをすべて応答ヘッダに コピーします:

    Header echo ^TS

  2. リクエストを受け付けた時刻とリクエストを処理した時間を入れたヘッダ、 MyHeader を応答に追加します。このヘッダはクライアントが サーバの負荷を直観的に知るためや、クライアント-サーバ間の ボトルネックを調べるために使うことができます。

    Header add MyHeader "%D %t"

    上記の設定では、以下のようなヘッダが応答に追加されることになります:

    MyHeader: D=3775428 t=991424704447256

  3. 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.

  4. リクエストに "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

top

Header ディレクティブ

説明:HTTP 応答ヘッダの設定
構文:Header [condition] set|append|add|unset|echo header [value] [early|env=[!]variable]
コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
上書き:FileInfo
ステータス:Extension
モジュール:mod_headers

このディレクティブは HTTP 応答ヘッダを置換、追加、削除できます。 ヘッダはコンテントハンドラや出力フィルタが実行された直後に実行され、 出て行くヘッダを変更できるようになっています。

オプションの conditiononsuccessalways のどちらかを指定できます。これは内部ヘッダテーブルのどれを 操作するかを決定します。onsuccess2xx ステータスコードの、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 ディレクティブは応答がネットワークに送られる直前に 処理されます。これは、ヘッダフィルタにより追加されるヘッダを 除き、ほとんどのヘッダを設定したり上書きしたりすることが 可能、ということです。

top

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 の入力フィルタにより 生成されたヘッダを上書きしたり修正したりできるようになっています。