会社が休みに入ると仕事ができていいですね(え
Apacheモジュールで処理を行った結果、404(Not Found)のHTTPステータスコードを返したい場合があります。その場合、2種類の方法があります。
ap_hook_handler
で登録したフック関数の戻り値で404を返すap_hook_handler
で登録したフック関数の引数 request_rec
構造体の status
の値を変更する(戻り値は0=OKを返す)さて、2つの違いは何でしょう。答えは、レスポンスボディに何が出力されるか、ということろに違いがあります。
Apacheのフックの処理の流れから考えてみましょう。とりあえず、今回ポイントとなっているあたりを概略図にすると下記のようになります。
Apacheがいろいろなフックを呼びだし、誰かが処理を担当してくれたらそれを返す、誰も処理してくれなかったらエラー処理して返す、という感じでしょうか。
このとき、フック関数の戻り値で404を返すと下記のように処理が流れます。
エラー処理のほうに流れるわけですね。よって、エラー処理で生成されたレスポンスボディが返されます。Apacheの設定で ErrorDocument
ディレクティブを設定している場合、指定されているコンテンツがレスポンスされます。
一方、request_rec
構造体の status
の値を変更する場合、フック関数自体はOK(処理完了)を返すので、エラーレスポンスには処理が流れません。よって、 ap_rwrite
などでレスポンスボディをセットしていれば、その内容がレスポンスされます。
この動きは、404エラーに限らず、500(Internal Server Error)などでも同様です。
これを理解できると、
ErrorDocument
ディレクティブで設定された 404 ページを表示させたいなど便利な使い方ができます。
Apacheモジュール開発している人なんてあまりいないと思いますが、ご参考までに!
2015/12/30 20:23:08 | Trackbacks (0) | Comments (0) | Technology
オリジナルな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