header関数とステータスコードの関係
あー、なんか、 header("HTTP/1.0 404"); だけで「404 Not Found」の文字列が返ってくるみたいですよ……さすがPHP。
2008-12-14 - kotori@notes
HTTPのステータスコードとPHPの関係についてid:takahashimさんにコメント欄で教えてもらったので試してみましたよ。
<?php header('HTTP/1.0 404');
というファイルにFirefoxでアクセスしてLiveHTTPHeadersで様子を見ていると…
http://localhost/test.php GET /test.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4 (中略) HTTP/1.x 404 Not Found Date: Mon, 15 Dec 2008 15:07:21 GMT Server: Apache/2.2.9 (Unix) mod_ssl/2.2.9 OpenSSL/0.9.7l DAV/2 PHP/5.2.6 X-Powered-By: PHP/5.2.6 Content-Length: 0 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html
「HTTP/1.x 404 Not Found」っていうヘッダが送出されてる。なんか便利なんだけど気持ち悪い。さすがPHP。
「HTTP/1.x」というのが気になるので1.0と1.1で意味合いが違う302で試してみる。
付記: 「1.x」というのはLiveHTTPHeadersが付けているもののようです。教えていただいたid:shimookaさんに感謝。普段こういう深追いしないからな…と反省。
<?php header('HTTP/1.0 302');
http://localhost/test.php GET /test.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4 (中略) HTTP/1.x 302 Found Date: Mon, 15 Dec 2008 15:11:16 GMT Server: Apache/2.2.9 (Unix) mod_ssl/2.2.9 OpenSSL/0.9.7l DAV/2 PHP/5.2.6 X-Powered-By: PHP/5.2.6 Content-Length: 0 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html X-Pad: avoid browser bug
HTTP 1.1の「Found」が返されてきた。ちなみにHTTP 1.0の場合は「Moved Temporarily」。この挙動はアクセス時にHTTP 1.1でアクセスしてるからかもしれないけど。
いずれにせよ気持ち悪いので実際に使うことはなさそう…。ちなみにmoonyの場合はMoony_Actionクラスのstatusメソッドを使えばOKです。