PHP (Apache) po cichu konwertuje HTTP 429 i inne na 500
Właśnie odkryłem dziwaczność w metodzie header () w PHP, cicho konwertując niektóre z moich statusów na 500. Ponieważ nie miałem szczęścia znaleźć wzmiankę o tym zachowaniu w różnych wyszukiwaniach internetowych, dodałem to tutaj w nadziei na ocalenie innych. , ale także zapytać, czy ktoś odkrył lepsze obejście (z PHP lub Zend1) niż wymyśliłem.
Biorąc pod uwagę prosty skrypt PHP, taki jak:
<?php
header('HTTP/1.1 429');
echo "Too Many Requests\n";
Spodziewałbym się otrzymać coś takiego:
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
Zamiast tego faktycznie zwraca:
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
Dodając do tajemnicy, w moim dzienniku błędów apache nie ma żadnych zdarzeń, a dziennik dostępu pokazuje poprawny kod statusu (a więc inny niż ten, który został wysłany do przeglądarki):
$IP - - [18/Jul/2013:16:31:34 -0700] "GET /test/429.php HTTP/1.1" 429 11 "-" "curl/7.30.0"
Wszystko działa dobrze podczas testowania wielu innych kodów statusu, takich jak 401, 420, 426.
Wszystko działa dobrze, jeśli mam wyraźne i wysłać nagłówek („HTTP / 1.1 429 Too Many Requests”); Byłoby to przydatne obejście, z wyjątkiem tego, że używam Zend Framework, a jego metoda setHttpResponseCode oczekuje liczby całkowitej, której używa jako trzeciego parametru do funkcji header () php.
Od tamtej pory odkryłem, że ma on zastosowanie szczególnie do statusów dodanych w RFC 6585 (patrzhttps://github.com/php/php-src/pull/274), chociaż jestem trochę zdezorientowany, dlaczego statusy takie jak 426 działają, gdy wyraźnie nie występują w kodzie źródłowym 5.4.14 i 5.4.16 (dwie wersje, które testowałem), ale niefunkcjonalne, takie jak 429 są
Aktualizacja:
Jak wskazują odpowiedzi, jest to głównie problem Apache, a nie PHP, odpowiednio zaktualizowałem tytuł. Najciekawsze wydaje się to, że jest to naprawiane tylko w niektórych wersjach Apache (bez widocznej spójności między starym a nowym). Uważam, że omawiany problem upstream jest tutaj:https://issues.apache.org/bugzilla/show_bug.cgi?id=44995