« Studio 8 注文 | メイン | FinderPop 2.0! »

エラーはエラーと返すべき

まとめると、実運用ではCGI::CarpのfatalsToBrowserを使わないという話。社内向け

フツーのCGIで、

#!/usr/bin/perl
use strict;
use CGI::Carp qw(fatalsToBrowser);#fatalsToBrowserを利用
use CGI;
my $q = CGI->new;

die "Bad error here";

print $q->header;
print "test";

というものを書いて、実行するともちろんdieをする。そして画面には以下のHTMLが出力される。

<h1>Software error:</h1>
<pre>Bad error here at /var/www/html/test/carp_fatal.cgi line 9.</pre>
<p>
For help, please send mail to the webmaster (<a href="mailto:root@localhost">root@localhost</a>), giving this error message 
and the time and date of the error.

</p>

ここまでは問題ない。
問題はリターンコード。

HTTP/1.0 200 OK
Connection: close
Date: Tue, 25 Oct 2005 07:37:29 GMT
Server: Apache
Content-Type: text/html      

と「200」、「OK」、「問題なし」と返ってくる。問題あるのに。。

エラー時のレスポンスのカスタマイズが普通のCGIではできないので、こういう形になっているのだろうけど、これでは困る事がある。
例えば、

my $ua = LWP::UserAgent->new();
my $req = HTTP::Request->new('GET',"http://nomadscafe.jp/test/carp_fatal.cgi"); 
my $res = $ua->request($req);
if($res->is_success){
    #ほげほげ
}

と言ったときに、目で見ればエラーなんだけどリターンコードが200だから、is_succes内の処理になってしまう。このまま行くのなら、

<h1>Software error:</h1>

これを正規表現で見つけるとかそういう面倒なことをしないとならない。

「use CGI::Carp qw(fatalsToBrowser);」がなければ普通にInternal Server Errorになります。セキュリティの問題もあるし、実運用に入ったらfatalsToBrowserは消しましょう。エラーはエラーログをみましょう。ユーザにエラー画面を見せたくないのなら、ApacheのErrorDocument設定を利用しましょう。

ErrorDocument  500  /error/500.html


PHPはエラー時も「200 OK」が返っているように見えるのですが、エラーはエラーとする方法はないのでしょうか、PHPに詳しい方教えてください。

トラックバック

この一覧は、次のエントリーを参照しています: エラーはエラーと返すべき:

» [Perl][メモ] CGI::Carpのステータス from どんぞこ日誌
  CGI::CarpのfatalsToBrowserがステータスに500を返さないというお話。なるほど…… あくまでもCGI::CarpのfatalsT... [詳しくはこちら]

コメント

php.iniのdiplay_errorだか
error_reportingだかの辺りを編集でいけないでしょうか。うろ覚えですが。

情報ありがとうございます。
試してみましたが、200 OKが返ってきました。
php.iniに
error_reporting = 0
display_errors = Off
として

で試してみました。

PHPはPerl/CGIとは勝手がけっこう違いますねぇ。

コメントを投稿