オリジナルなApacheモジュールを呼びだそうとするとき、設定ファイルの記述方法としては2種類あります。
ところで、世の中のウェブアプリケーションフレームワークにはステータスコード404(Not Found)のときに起動するものがあります。これはつまり、サーバーのドキュメントルート配下にファイルが無かったときにアプリケーションを起動するというものです。(ほんとよく考えたなぁ)
そこで、この考え方をApacheモジュールでも利用することを考えます。まず、エラードキュメントはApacheの設定で指定できますので、適当なURIを指定します。そして、そのURIに対して、Locationディレクティブでハンドラを登録します。こうすると、エラードキュメントが呼び出されるときにモジュールを呼び出してくれるわけですね。httpd.confの記述例としては下記のようになるでしょう。
ErrorDocument 404 /bootstrap/ <Location "/bootstrap/"> SetHandler handler_of_application </Location>
これでばんばんざい、というわけにいきません。404で起動するということは、Apacheとしてはエラー状態なわけです。これがどういう問題を起こすかというと、
というようなことがあります。
これらの問題を解決するためには、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
UnicodeからShift_JISは真逆の処理をしてあげれば良い。ただし、UnicodeとShift_JISは完全に可換ではないので、欠損する可能性あり。
タグ : Shift_JIS,UTF-16,Unicode,シフトJIS
2011/02/13 17:32:21 | Trackbacks (0) | Comments (0) | Technology
いざ、調べようと思うとなかなか見つからなかったのでメモ。
インターネットで使える文字コードの定義ね。
何気に最近更新されていたみたいだ。「last updated 2010-11-04」とかになってる。csCP51932ってなんぞ...。
一応、列挙されているキャラクタセット名以外は使うべきではない(もちろん大文字・小文字も区別される)んだけど、たまに変なキャラクタセット名が送られてくるよね。特にスパムメールとか。
逆にこれに従っておけば、一般的なアプリケーションに読み取ってもらえることを期待できる。
2011/02/13 17:06:54 | Trackbacks (0) | Comments (0) | Technology