# Apache のハンドラの使用

- ハンドラとは
- 例
- プログラマ向けのメモ

## ハンドラとは

関連モジュール mod_actions mod_asis mod_cgi mod_imap mod_info mod_include mod_mime mod_negotiation mod_status | 関連ディレクティブ Action AddHandler RemoveHandler SetHandler

「ハンドラ」とは、ファイルが呼ばれたときに実行される動作の Apache における 内部表現です。通常、ファイルはファイル型に基づいた暗黙の ハンドラがあります。普通はすべてのファイルは単にサーバに扱われますが、 ファイルタイプの中には別に「ハンドル」 (訳注: 扱う) されるものもあります。

Apache 1.1 では、ハンドラを明示的に使用する機能が追加されました。 ファイルの拡張子や置いている場所に基づいて、ファイル型と関係なくハンドラを 指定することができます。これはより優雅な解決法という点と、ファイルに タイプとハンドラの両方を関連付けることができるという 点で優れています。 (複数の拡張子のあるファイル も参照してください)。

ハンドラはサーバに組み込んだり、モジュールとして含めたり、 Action ディレクティブとして 追加したりすることができます。以下は標準配布に組み込まれているハンドラです。

- default-handler: `default_handelr()` を使ってファイルを送ります。 静的なコンテンツを扱うときにデフォルトで使用されるハンドラです。 (core)
- send-as-is: HTTP ヘッダのあるファイルをそのまま送ります。 (mod_asis)
- cgi-script: ファイルを CGI スクリプトとして扱います。 (mod_cgi)
- imap-file: イメージマップのルールファイルとして解析します。 (mod_imap)
- server-info: サーバの設定情報を取得します。 (mod_info)
- server-parsed: SSI を解析します。 (mod_include)
- server-status: サーバの状態報告を取得します。 (mod_status)
- type-map: コンテントネゴシエーションのためのタイプマップとして解析します。 (mod_negotiation)

## 例

### CGI スクリプトを用いて静的なコンテンツを変更する

以下のディレクティブによって、拡張子が `html` であるファイルは `footer.pl` CGI スクリプトを起動するようになります。

         Action add-footer /cgi-bin/footer.pl
         AddHandler add-footer .html

CGI スクリプトは望ましい修正や追加を行なって、元々要求された文書 (環境変数 `PATH_TRANSLATED` で指されています) を送る責任があります。

### HTTP ヘッダのあるファイル

以下のディレクティブは `send-as-is` ハンドラを使用する ように指示します。このハンドラは自分自身の HTTP ヘッダを持っているファイルに 使用されます。ここでは、拡張子に関わらず、`/web/htdocs/asis` ディレクトリにある全てのファイルは `send-as-is` ハンドラによって 扱われます。

        <Directory /web/htdocs/asis>
        SetHandler send-as-is
        </Directory>

## プログラマ向けのメモ

ハンドラの機能を実装するために、利用すると便利かもしれないものが Apache API に追加されました。 詳しく言うと、`request_rec` 構造体に新しいレコードが 追加されたということです。

        char *handler

もしモジュールがハンドラに関わりたい場合、やらなければならないことは、 リクエストが `invoke_handler` ステージに達する以前に `r->handler` を設定することだけです。 ハンドラはコンテントタイプの代わりにハンドラ名を使うようになっていること以外は、 以前と同じように実装されています。必ず要求されているわけではありませんが、 メディアタイプの名前空間を侵さないように、ハンドラの名前にはスラッシュ を含まない、ダッシュ (訳注: "-") で分離された名前を付ける習慣になっています。