koba::blog

小林聡: プログラマです

mod_perlから200以外のステータスコードを返す

CGI.pm を使って200以外のステータスコードを返すには、

my $cgi = new CGI;
print $cgi->header(
            -status => '404 Not Found',
        );
print $error_document;      # 自前のエラードキュメントを出力。

のようにすればいいのですが、mod_perl環境下で上のコードを実行すると、自前のエラードキュメントに続いてApacheもエラードキュメントを出力してしまいます(だいたい200以外のステータスコードを返したいようなときは自前のエラードキュメントを出力したいに決まってる)。

これを避けるためには、mod_perl環境下のときだけNPHスクリプトとして動作させるようにすればいいです。

my $cgi = new CGI;
print $cgi->header(
            -status => '404 Not Found',
            -nph    => $ENV{MOD_PERL},
        );
print $error_document;      # 自前のエラードキュメントを出力。

このとき、httpd.conf のmod_perlの設定で、PerlSendHeader を Off にしておく必要があります(デフォルトはOff)。

ただし、NPHスクリプトとして動作させると、access_logの出力のステータスコードが一律200になってしまい、出力したコンテンツのサイズも記録されません。

ちょっとやな感じですね。