2013-07-18 20 views
10

にHTTP 429などの変換私は(PHPのヘッダで風変わりを発見した)私は、さまざまなWeb検索で、この動作の言及を見つけることに運がなかったので黙っ500に私のステータスの一部を変換する方法、私は私が作ってみたよりも他にいくつかの悪化を保存するのを期待してここにこれを追加するんだけど、誰もが(どちらかPHPまたはZend1で)より良い回避策を発見した場合にも依頼します。PHP(アパッチ)黙っ500

考えるような単純な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のエラーログにイベントされず、アクセスログは、正しいステータスコード(したがってジを示し)ブラウザに送信されてしまったものとはfferent:401、420のような他の多くのステータスコードをテストするとき

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

すべてが、私は、明示的だと(ヘッダを送信する場合426

すべてはまた、正常に動作し、正常に動作します'HTTP/1.1 429リクエストが多すぎます');これは私は、Zend FrameworkのそのsetHttpResponseCode法を使用しているが、それはPHPのヘッダ()関数の3番目のパラメータとして使用して整数を期待していることを除いて有用な回避策であろう。

私はそれが明らかにRFC 6585(詳細はhttps://github.com/php/php-src/pull/274を参照)に追加されたステータスに適用されているようだが、なぜ426のようなステータスが明らかにソースコードに存在しない5.4.14と5.4.16が、429のような非機能的なものである(私はに対してテストした二つのバージョン)。

更新:

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

+0

は、ここにリンクだ私は似たようなテストした最後の時間は、結論はこのように見えましたPHPソースに429があることを示しています:https://github.com/php/php-src/blob/PHP-5.4.14/sapi/cgi/cgi_main.c#L388 –

+1

FWIWこれを欺くことはできません5.4.16の組み込みのdevサーバ。 Apacheを使ってテストしていますよね? – Charles

+1

リターンコードを設定するパラメータもあります。あなたはそれを試しましたか?また、100から499ステップの大きさまでのコードを多く入れ替えるスクリプトは、可能なものと不可能なものを知っていると良いでしょう。また、コンテキストが明確になるように、PHP SAPIと同様に使用しているウェブサーバーとバージョンを教えてください。 – hakre

答えて

5

これはApacheのdireclyで見つけることができませんが、私は以下のテスト(Apacheのバージョン2.2.22)から推測できます

あなたの設定でこれを追加します。

ErrorDocument 429 Aaargh to heavy 

再起動:

$ sudo /etc/init.d/apache2 restart 
Syntax error on line 6 of /etc/apache2/conf.d/localized-error-pages: 
Unsupported HTTP response code 429 
Action 'configtest' failed. 
The Apache error log may have more information. 
    ...fail! 

429seems a recent addition in rfc6585、ステータス:提案、日: 2012年4月。HTTP RFCの1年は私の経験ではただの赤ちゃんです。それにApacheで取得してからパッケージリポジトリに取得するプロセスを追加してください... はApache 2.4を試すことができます...

+0

'しかし、私はこれから推論することができます - あなたはリンクを追加するのを忘れましたか? – DaveRandom

+0

Erm、いいえ、それに続くものからです....私が 'ErrorDocument'コンテキストで429を使用しようとすると、そのApacheは気にしません。 – Wrikken

+1

はい、それは確かに問題と思われます。 PHPのビルトインWebサーバーをチェックして、429を正しく返します。私が2.2.xに固執しているのは残念だ。 nginxへの移行計画を加速する時間。 –

3

おそらく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 
+0

Hm、同バージョン(2.2.22 )ここでは、モジュールとしても、 'cgi-fcgi'としても動作しません.... Windows上で動くことができます利点がありますか? – Wrikken

+0

@Wrikken:窓の下では、有効であってもURLの中に '*'をつけることはできません。 Apacheはどういうわけかそれほど多くの魔法のことをしません。 – hakre