エラーはエラーと返すべき
まとめると、実運用では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に詳しい方教えてください。
コメント
php.iniのdiplay_errorだか
error_reportingだかの辺りを編集でいけないでしょうか。うろ覚えですが。
投稿者: kato | 2005年10月31日 22:23
情報ありがとうございます。
試してみましたが、200 OKが返ってきました。
php.iniに
error_reporting = 0
display_errors = Off
として
で試してみました。
PHPはPerl/CGIとは勝手がけっこう違いますねぇ。
投稿者: かぜぶろ | 2005年11月01日 13:03