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

Blog

Apacheモジュールで404エラーの出し方2種と違い

会社が休みに入ると仕事ができていいですね(え

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)などでも同様です。

これを理解できると、

  • 引数が不正で処理が続行できない場合など、モジュールでエラーを出力したい時、なんでエラーになったのかエラーメッセージを表示しつつ 400 のステータスコードを返す
  • 引数が不正だった場合でも、ファイルのダウンロードの処理(CSVの出力など)の場合は、 ErrorDocument ディレクティブで設定された 404 ページを表示させたい

など便利な使い方ができます。

Apacheモジュール開発している人なんてあまりいないと思いますが、ご参考までに!

タグ : apache,module,モジュール

2015/12/30 20:23:08 | Trackbacks (0) | Comments (0) | Technology

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

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