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です。