mod_headers HTTP リクエストのヘッダと応答のヘッダのカスタマイズ Extension mod_headers.c headers_module RequestHeader は Apache 2.0 以降のみで使用可能

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

処理の順番

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

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

RequestHeader append MirrorID "mirror 12"
RequestHeader unset MirrorID

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

  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
RequestHeader HTTP リクエストヘッダの設定 RequestHeader set|append|add|unset header [value] server configvirtual host directory.htaccess FileInfo

このディレクティブは HTTP リクエストヘッダを置換、追加、削除できます。 ヘッダはコンテントハンドラが実行される直前に実行され、 入って来るヘッダを変更することが可能になっています。 行なう処理は第 1 引数により決まります。これには以下の値を指定 することができます:

set
リクエストヘッダを設定します。同じ名前のヘッダが存在していると、 それを置き換えます。
append
リクエストヘッダは、既に存在する同じ名前のヘッダに追加されます。 新しい値が既存のヘッダに追加されるときには、既存のヘッダの 後にコンマで区切られて追加されます。これはヘッダに複数の値を 指定するときの HTTP の標準の方法です。
add
ヘッダが既に存在しているときでさえも、リクエストヘッダを 既存のヘッダに追加します。これにより、二つ (かそれ以上) の ヘッダの名前が同じになることがあります。その結果、想定できない ことが起こる可能性がありますので、一般的には append の方を 使う方が良いでしょう。
unset
もし指定された名前のリクエストヘッダが存在していれば、削除されます。 同じ名前の複数のヘッダがあるときは、すべて削除されます。

この引数の後にはヘッダ名 (header) が続きます。 ヘッダ名には最後にコロンを含めることもできますが、無くても構いません。 大文字小文字は区別されません。add, append, set の場合は、value が三つ目の 引数として指定されます。value に空白がある場合は二重引用符で 囲む必要があります。unset の場合は、value は指定しません。

RequestHeader ディレクティブは、 fixup フェーズでリクエストがハンドラに扱われる直前に 処理されます。これにより、ブラウザや Apache の入力フィルタにより 生成されたヘッダを上書きしたり修正したりできるようになっています。

Header HTTP 応答ヘッダの設定 Header set|append|add|unset|echo header [value [env=[!]variable]] server configvirtual host directory.htaccess FileInfo

このディレクティブは HTTP 応答ヘッダを置換、追加、削除できます。 ヘッダはコンテントハンドラや出力フィルタが実行された直後に実行され、 出て行くヘッダを変更することが可能になっています。 行なう処理は最初の引数により決まります。これには以下の値を指定 することができます:

set
応答ヘッダを設定します。同じ名前のヘッダが存在する場合はそれを 置き換えます。value にはフォーマット文字列を 指定することもできます。
append
応答ヘッダを既に存在する同じ名前のヘッダに追加します。 新しい値が既存のヘッダに追加されるときには、既存のヘッダの 後にコンマで区切られて追加されます。これはヘッダに複数の値を 指定するときの HTTP の標準の方法です。
add
ヘッダが既に存在しているときでさえも、応答ヘッダを 既存のヘッダに追加します。これにより、二つ (かそれ以上) の ヘッダの名前が同じになることがあります。その結果、想定できない ことが起こる可能性がありますので、一般的には append の方を 使う方が良いでしょう。
unset
もし指定された名前の応答ヘッダが存在していれば、削除されます。 同じ名前のヘッダが複数あるときは、すべて削除されます。
echo
指定されたものと同じ名前のリクエストヘッダを応答ヘッダで そのまま返します。header には正規表現も指定できます。

この引数の後にはヘッダ名 (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 の値です。

Header ディレクティブが add, append, set として 使われたときには、動作を行なう条件を四つ目の引数で指定することができます。 env=... 引数で指定された 環境変数 が存在する (もしくは env=!... が指定されていて環境変数が存在しない) 場合は、Header ディレクティブで指定された動作が行なわれます。そうでない場合は、 ディレクティブはそのリクエストには何もしません。

Header ディレクティブは応答がネットワークに送られる直前に 処理されます。これは、ヘッダフィルタにより追加されるヘッダを 除き、ほとんどのヘッダを設定したり上書きしたりすることが 可能、ということです。