(他に忘れられがちなもの以外|意外)に忘れられがちなのが、これ。
ステータス200なのに「その商品はありません」エンジニア以外の人間が読むと、「ページがなければ404エラー。そんなのあたりまえだろ。」で終わってしまいかねない。 ここでは、「404エラーページを見せろ」ではなく「httpヘッダーで404を返せ」と言っているのがミソだ。
「ステータスコードをいじるのは難しい」といった言い訳をするエンジニアもいるが、それはうそだ。
実はCGIなら、最初の行に"Status: ###"と書き込むだけでWeb Serverがよきに計らってくれる。だから、実はこのことは言語の仕様ですらなく、CGIの仕様だ。以下のShell Scirptは立派なCGIだ。
#!/bin/sh echo "Status: 404 Not Found" echo "Content-Type: text/plain" echo "" echo "The requested URI $REQUEST_URI not found on this server $SERVER_NAME."
PerlのCGI.pmであれば、
my $q = CGI->new; # .... print $q->header(-status => "404 Not Found");
と簡潔に書ける。
ちなみに、Status Codeの後ろは、任意の文字列でいいので、
$q->header(-status => "404 Blog Not Found");
とやってももちろんHTTP準拠である。
Dan the Man with Too Many Pages Not Found
use Apache2::RequestRec ();
$r->status('404');
この場合、Statusヘッダを出力する必要もないみたいです。