Apache HTTP サーバ バージョン 2.4

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

# Apache モジュール mod_headers

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

説明: | HTTP リクエストのヘッダと応答のヘッダのカスタマイズ
ステータス: | Extension
モジュール識別子: | headers_module
ソースファイル: | mod_headers.c
互換性: | `RequestHeader` は Apache 2.0 以降のみで使用可能

### 概要

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

### トピック

- 処理の順番
- 早期処理、後期処理
- 例

### ディレクティブ

### Bugfix checklist

- httpd changelog
- Known issues
- Report a bug

## 処理の順番

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

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

`RequestHeader append MirrorID "mirror 12"
RequestHeader unset MirrorID`

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

## 早期処理、後期処理

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

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

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

## 例

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`

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