PHP (Apache) wandelt im Hintergrund HTTP 429 und andere in 500 um
Ich habe gerade eine Kuriosität in der header () -Methode von PHP entdeckt, die einige meiner Status stillschweigend in 500 konvertiert. Da ich bei verschiedenen Websuchen kein Glück hatte, dieses Verhalten zu erwähnen, füge ich dies hier hinzu, in der Hoffnung, anderen Ärger zu ersparen , aber auch zu fragen, ob jemand eine bessere Lösung gefunden hat (entweder mit PHP oder Zend1) als ich.
Gegeben ein einfaches PHP-Skript wie:
<?php
header('HTTP/1.1 429');
echo "Too Many Requests\n";
Ich würde folgendes erwarten:
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
Stattdessen wird tatsächlich Folgendes zurückgegeben:
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
Außerdem enthält mein Apache-Fehlerprotokoll keine Ereignisse, und das Zugriffsprotokoll enthält den korrekten Statuscode (also einen Unterschied zu dem, der an den Browser gesendet wurde):
$IP - - [18/Jul/2013:16:31:34 -0700] "GET /test/429.php HTTP/1.1" 429 11 "-" "curl/7.30.0"
Beim Testen mit vielen anderen Statuscodes wie 401, 420, 426 funktioniert alles einwandfrei.
Alles funktioniert auch, wenn ich explizit bin und einen Header sende ('HTTP / 1.1 429 Too Many Requests'); Dies wäre eine nützliche Problemumgehung, mit der Ausnahme, dass ich Zend Framework verwende und die setHttpResponseCode-Methode eine Ganzzahl erwartet, die als dritter Parameter für die header () -Funktion von php verwendet wird.
Ich habe seitdem festgestellt, dass es speziell für Status gilt, die in RFC 6585 hinzugefügt wurden (siehehttps://github.com/php/php-src/pull/274), obwohl ich ein wenig verwirrt bin, warum Status wie 426 funktionieren, wenn sie im Quellcode für 5.4.14 und 5.4.16 (die beiden Versionen, gegen die ich getestet habe) eindeutig nicht vorhanden sind, aber nicht funktionierende wie 429 sind.
Aktualisieren:
Wie die Antworten gezeigt haben, handelt es sich hauptsächlich um ein Apache-Problem, nicht um PHP. Ich habe den Titel entsprechend aktualisiert. Am interessantesten scheint zu sein, dass dies nur in bestimmten Versionen von Apache behoben ist (ohne erkennbare Konsistenz zwischen alt und neu). Ich glaube, das vorgelagerte Problem ist hier:https://issues.apache.org/bugzilla/show_bug.cgi?id=44995