Właśnie odkryłem dziwność w metodzie header() w trybie cichym konwersja niektórych moich statusów na 500. Ponieważ nie miałem szczęścia w znalezieniu wzmianki o tym zachowaniu w różnych wyszukiwaniach internetowych Dodaję to tutaj, w nadziei, że uratuję inne osoby, ale także zapytam, czy ktoś odkrył lepsze obejście (z PHP lub Zend1), niż ja wymyśliłem.PHP (Apache) po cichu konwertując HTTP 429 i inne na 500
Biorąc prosty skrypt PHP jak:
<?php
header('HTTP/1.1 429');
echo "Too Many Requests\n";
Spodziewam się, aby 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 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
Dodawanie do tajemnicy , nie ma żadnych zdarzeń w moim dzienniku błędów apache, a dziennik dostępu pokazuje poprawny kod statusu (czyli di fferent z co został wyrzucony 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 prawidłowo podczas testowania w wielu innych kodów stanu jak 401, 420, 426.
Wszystko działa również w porządku, jeśli jestem jawny i wysłać nagłówek ("HTTP/1.1 429 Too Many Requests"); Byłoby to użyteczne obejście, oprócz tego, że używam Zend Framework, a jego metoda setHttpResponseCode oczekuje liczby całkowitej, która jest używana jako trzeci parametr funkcji header() php.
Od tamtej pory odkryłem, że wydaje się, że dotyczy to w szczególności statusów dodanych w RFC 6585 (patrz https://github.com/php/php-src/pull/274), chociaż jestem nieco zdezorientowany, dlaczego statusy takie jak 426 działają, gdy wyraźnie nie występują w kodzie źródłowym dla 5.4.14 i 5.4.16 (dwie wersje, których testowałem), ale niefunkcjonalne jak 429.
Aktualizacja:
Jak wykazały odpowiedzi, jest to głównie kwestia Apache, PHP nie, mam zaktualizowany tytuł odpowiednio. Najbardziej interesujące wydaje się, że jest to naprawione tylko w niektórych wersjach Apache (bez wyraźnej zgodności pomiędzy starymi i nowymi). Uważam, że problem, o którym mowa powyżej jest tutaj: https://issues.apache.org/bugzilla/show_bug.cgi?id=44995
Dla porównania, oto link pokazując, że 429 wyraźnie istnieje w źródle PHP: https://github.com/php/php-src/blob/PHP-5.4.14/sapi/cgi/cgi_main.c#L388 –
FWIW Nie mogę tego zrobić za pomocą wbudowany serwer dev w wersji 5.4.16. Testujesz używając Apache, prawda? – Charles
jest również parametr do ustawienia kodu powrotu. Czy próbowałeś tego? Również skrypt, który permutuje wiele kodów zaczynających się od 100 do 499 stopni, dobrze byłoby wiedzieć, które z nich są możliwe, a które nie. Proszę również poinformować serwer WWW i wersję, której używasz, a także SAPI PHP, aby kontekst był jasny. – hakre