10

PHP の header() メソッドで、私のステータスの一部を 500 に静かに変換する奇妙な点を発見しました。さまざまな Web 検索でこの動作についての言及を見つけることができなかったので、他の人を不快にさせないように、ここにこれを追加します。だけでなく、私が思いついたよりも優れた回避策 (PHP または Zend1 のいずれか) を誰かが発見したかどうかも尋ねます。

次のような単純な PHP スクリプトがあるとします。

<?php
header('HTTP/1.1 429');
echo "Too Many Requests\n";

私は次のようなものを受け取ることを期待しています:

HTTP/1.1 429
Date: Thu, 18 Jul 2013 22:19:45 GMT
Content-Length: 11
Content-Type: text/html; charset=UTF-8

Too Many Requests

代わりに、実際には以下を返します。

HTTP/1.1 500 Internal Server Error
Date: Thu, 18 Jul 2013 22:19:45 GMT
Content-Length: 11
Content-Type: text/html; charset=UTF-8

Too Many Requests

謎に加えて、私のApacheエラーログにはイベントがなく、アクセスログには正しいステータスコードが表示されます(したがって、ブラウザに送信されたものとは異なります):

$IP - - [18/Jul/2013:16:31:34 -0700] "GET /test/429.php HTTP/1.1" 429 11 "-" "curl/7.30.0"

401、420、426 などの他の多くのステータス コードでテストすると、すべて正常に動作します。

私が明示的で、header('HTTP/1.1 429 Too Many Requests'); を送信すると、すべて正常に動作します。これは、私が Zend Framework を使用していて、その setHttpResponseCode メソッドが php の header() 関数の 3 番目のパラメーターとして使用する整数を想定していることを除いて、便利な回避策です。

それ以来、RFC 6585 で追加されたステータスに特に適用されるように思われることを発見しました ( https://github.com/php/php-src/pull/274を参照)。 5.4.14 と 5.4.16 (私がテストした 2 つのバージョン) のソース コードには明らかに存在しませんが、429 のような機能しないものは存在します。

アップデート:

回答が示しているように、これは主に PHP ではなく Apache の問題です。それに応じてタイトルを更新しました。最も興味深いのは、これが特定のバージョンの Apache でのみ修正されていることです (古いものと新しいものの間に明らかな一貫性はありません)。問題の上流の問題はここにあると思います: https://issues.apache.org/bugzilla/show_bug.cgi?id=44995

4

2 に答える 2

4

それはおそらくあなたのSAPI構成です。前回同様のことをテストしたとき、結論は次のようになりました。

<?php
header('HTTP/ 429 Too Many Requests', false, 429);
echo "Too Many Requests\n";

あなたの場合、私にとってはまだうまくいきます(Apache 2.2 / FCGI / Windows):

>curl -i "http://local.example.com/header-test.php"
HTTP/1.1 429 Too Many Requests
Date: Thu, 18 Jul 2013 23:49:09 GMT
Server: Apache/2.2.22 (Win32) mod_fcgid/2.3.6
X-Powered-By: PHP/5.4.13
Transfer-Encoding: chunked
Content-Type: text/html

Too Many Requests
于 2013-07-18T23:51:01.710 に答える