会社が休みに入ると仕事ができていいですね(え
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