「あなくつ」のおもちゃばこ

Blog

Apacheモジュールを404型ブートストラップで起動することを考える

オリジナルなApacheモジュールを呼びだそうとするとき、設定ファイルの記述方法としては2種類あります。

  1. Locationディレクティブで特定のリクエストURIに対してハンドラを指定する
  2. AddTypeディレクティブで独自のコンテンツタイプに対してハンドラを指定する

ところで、世の中のウェブアプリケーションフレームワークにはステータスコード404(Not Found)のときに起動するものがあります。これはつまり、サーバーのドキュメントルート配下にファイルが無かったときにアプリケーションを起動するというものです。(ほんとよく考えたなぁ)

そこで、この考え方をApacheモジュールでも利用することを考えます。まず、エラードキュメントはApacheの設定で指定できますので、適当なURIを指定します。そして、そのURIに対して、Locationディレクティブでハンドラを登録します。こうすると、エラードキュメントが呼び出されるときにモジュールを呼び出してくれるわけですね。httpd.confの記述例としては下記のようになるでしょう。

ErrorDocument 404 /bootstrap/

<Location "/bootstrap/">
    SetHandler handler_of_application
</Location>

これでばんばんざい、というわけにいきません。404で起動するということは、Apacheとしてはエラー状態なわけです。これがどういう問題を起こすかというと、

  • ステータスコードとして、404がクライアントに伝達されてしまう
  • ファイルサイズが小さいと、IEなどで「やさしい」エラーメッセージ(Apacheドキュメント風に(笑))が表示されてしまう
  • CookieやLocationなど、モジュールでheaders_outに設定したヘッダを出力してくれない

というようなことがあります。

これらの問題を解決するためには、Apacheの状態をエラー状態から通常の状態に戻してあげます。具体的には、request_rec構造体のstatus変数にHTTP_OK定数を設定してあげればいいようです。

これはまったくもって予想ですが、モジュールが最初呼び出されるとき、statusには404が入っていることから、Apacheがあちこちのモジュールを駆けまわる時に状態を伝達する変数となっているのでしょう。最終的にコアプロセスへもどってきたときに、statusにより出力処理を切り替えるのだと思います。

さぁこれでフレームワークっぽくモジュールができる!と思いきや、まだダメなんですね。フレームワークとして動作させるには、リクエストURIによって処理やレスポンスを切り替える、という動作が必要です。通常のリクエストによる呼び出しなら、request_rec構造体のuri変数やfilename変数などを使えばどこから呼び出されているかわかります。ところが、404駆動の場合、前出の変数は404に指定したの値(上記のhttpd.confの設定だと/bootstrap/がセットされてやってくる)になるのです。

そこで必要になってくるのが、request_rec構造体のprev変数です。Apacheには内部リダイレクトという機能(要は、ブラウザに表示されているURLは変わらないのだけれど、同じサーバー内の別の場所にあるコンテンツを読んでいる状態、たぶん。詳しくは、このあたりが参考になる。)があり、ErrorDocumentによって設定されているページはこの機能により呼び出されています。そして、内部リダイレクトを呼び出した元が、prev変数によって指し示されているのです。つまり、クライアントがリクエストしたURIを取得するためには、prev変数をたどって、呼び出し元のuri変数やfilename変数を取得してくればいいわけですね。

さて、これで404駆動でもモジュールが使えるようになりました。あとそこから先は、ディベロッパーの根性で開発してください!

タグ : 404,Apache,Bootstrap,Module,ブートストラップ,モジュール

2011/02/25 04:34:22 | Trackbacks (0) | Comments (0) | Technology

  • Top
  • Software
  • Blog
  • Laboratory
  • Profile
Search
Feeds of Blog
Archives

Copyright © 2004-2024 Ana-Kutsu All Rights Reserved.