Mam skrypt PHP, który musi odpowiadać za pomocą kodów odpowiedzi HTTP (kodów stanu), takich jak HTTP 200 OK lub jakiś kod 4XX lub 5XX.
Jak mogę to zrobić w PHP?
źródło
Mam skrypt PHP, który musi odpowiadać za pomocą kodów odpowiedzi HTTP (kodów stanu), takich jak HTTP 200 OK lub jakiś kod 4XX lub 5XX.
Jak mogę to zrobić w PHP?
Właśnie znalazłem to pytanie i pomyślałem, że potrzebuje bardziej kompleksowej odpowiedzi:
Począwszy od PHP 5.4 istnieją trzy metody osiągnięcia tego:
Ta header()
funkcja ma specjalny przypadek użycia, który wykrywa linię odpowiedzi HTTP i pozwala zastąpić ją niestandardową
header("HTTP/1.1 200 OK");
Wymaga to jednak specjalnego traktowania (szybkiego) CGI PHP:
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi')
header("Status: 404 Not Found");
else
header("HTTP/1.1 404 Not Found");
Uwaga: Zgodnie z HTTP RFC The fraza powodem może być dowolny ciąg niestandardowy (zgodne ze standardem), ale ze względu na kompatybilność klienta ja nie polecam umieszczenie tam losowy ciąg.
Uwaga: php_sapi_name()
wymaga PHP 4.0.1
Oczywiście przy pierwszym wariancie jest kilka problemów. Myślę, że największym z nich jest to, że jest częściowo przeanalizowane przez PHP lub serwer WWW i słabo udokumentowane.
Od wersji 4.3 header
funkcja ma trzeci argument, który pozwala nieco wygodnie ustawić kod odpowiedzi, ale użycie go wymaga, aby pierwszy argument był niepustym ciągiem. Oto dwie opcje:
header(':', true, 404);
header('X-PHP-Response-Code: 404', true, 404);
Polecam drugi . Pierwszy robi pracę na wszystkich przeglądarkach I zostały przetestowane, ale niektóre przeglądarki niewielki lub roboty sieciowe mogą mieć problem z linii nagłówka, który zawiera tylko dwukropek. Nazwa pola nagłówka w 2. miejscu. wariant nie jest oczywiście w żaden sposób ustandaryzowany i można go zmodyfikować, wybrałem po prostu miejmy nadzieję opisową nazwę.
http_response_code()
Funkcja została wprowadzona w PHP 5.4, i to wszystko o wiele łatwiejsze.
http_response_code(404);
To wszystko.
Oto funkcja, którą przygotowałem, gdy potrzebowałem kompatybilności poniżej 5.4, ale chciałem funkcjonalności „nowej” http_response_code
funkcji. Wierzę, że PHP 4.3 to więcej niż wystarczająca kompatybilność wsteczna, ale nigdy nie wiadomo ...
// For 4.3.0 <= PHP <= 5.4.0
if (!function_exists('http_response_code'))
{
function http_response_code($newcode = NULL)
{
static $code = 200;
if($newcode !== NULL)
{
header('X-PHP-Response-Code: '.$newcode, true, $newcode);
if(!headers_sent())
$code = $newcode;
}
return $code;
}
}
header('X-PHP-Response-Code: 404', true, 404);
działa poprawnie w PHP-FPM (FastCGI)headers_sent()
zawsze będzie prawdziwe zaraz po wywołaniuheader()
? (2) Czy kiedykolwiek znalazłeś coś takiego jak http_response_text () w świecie 5.4? Przynajmniej stary nagłówek () może wpływać na tekst po kodzie stanu.headers_sent()
jest prawdą, jeśli nie możesz dodać więcej nagłówków, ponieważ treść została już wysłana, a nie jeśli dodałeś nagłówek. (2) Przepraszamy, nie. Inne języki mają jednak lepszą obsługęhttp_response_code
(a może bardziej ogólnie modyfikowanie nagłówka) już nie działa poecho
czymś. Mam nadzieję, że to pomoże.Niestety znalazłem rozwiązania przedstawione przez @dualed mają różne wady.
Używanie
substr($sapi_type, 0, 3) == 'cgi'
nie jest enogh do wykrywania szybkiego CGI. Podczas korzystania z PHP-FPM FastCGI Process Managerphp_sapi_name()
zwraca fpm, a nie cgiFasctcgi i php-fpm ujawniają kolejny błąd wspomniany przez @Josh - używanie
header('X-PHP-Response-Code: 404', true, 404);
działa poprawnie pod PHP-FPM (FastCGI)header("HTTP/1.1 404 Not Found");
może się nie powieść, gdy protokołem nie jest HTTP / 1.1 (tj. „HTTP / 1.0”). Aktualny protokół musi zostać wykryty przy użyciu$_SERVER['SERVER_PROTOCOL']
(dostępny od PHP 4.1.0Istnieją co najmniej 2 przypadki, gdy wywołanie
http_response_code()
powoduje nieoczekiwane zachowanie:W celach informacyjnych znajduje się pełna lista kodów statusu odpowiedzi HTTP (ta lista zawiera kody ze standardów internetowych IETF, a także inne RFC IETF. Wiele z nich NIE jest obecnie obsługiwanych przez funkcję PHP http_response_code): http: //en.wikipedia .org / wiki / List_of_HTTP_status_codes
Możesz łatwo przetestować ten błąd, dzwoniąc:
Serwer wyśle kod odpowiedzi HTTP „500 Internal Server Error”, co spowoduje nieoczekiwane błędy, jeśli na przykład niestandardowa aplikacja kliencka dzwoni do serwera i oczekuje dodatkowych kodów HTTP.
Moje rozwiązanie (dla wszystkich wersji PHP od 4.1.0):
Wniosek
Implementacja http_response_code () nie obsługuje wszystkich kodów odpowiedzi HTTP i może zastąpić określony kod odpowiedzi HTTP innym kodem z tej samej grupy.
Nowa funkcja http_response_code () nie rozwiązuje wszystkich związanych z tym problemów, ale sprawia, że najgorsze jest wprowadzanie nowych błędów.
Rozwiązanie „kompatybilności” oferowane przez @dualed nie działa zgodnie z oczekiwaniami, przynajmniej w PHP-FPM.
Inne rozwiązania oferowane przez @dualed również zawierają różne błędy. Szybkie wykrywanie CGI nie obsługuje PHP-FPM. Aktualny protokół musi zostać wykryty.
Wszelkie testy i komentarze są mile widziane.
źródło
od PHP 5.4 możesz używać
http_response_code()
do pobierania i ustawiania kodu statusu nagłówka.tutaj przykład:
oto dokument tej funkcji w php.net:
http_response_code
źródło
Dodaj ten wiersz przed jakimkolwiek wyjściem treści, w przypadku, gdy nie używasz buforowania wyjściowego.
Zastąp część komunikatu („OK”) odpowiednią wiadomością, a kod stanu odpowiednim kodem (404, 501 itp.)
źródło
Jeśli jesteś tutaj, ponieważ Wordpress podaje 404 podczas ładowania środowiska, powinno to rozwiązać problem:
Problem jest spowodowany wysłaniem nagłówka Status: 404 Not Found. Musisz to zmienić. Będzie to również działać:
źródło
Dzięki funkcji nagłówka . W sekcji dotyczącej pierwszego parametru znajduje się przykład.
źródło
http_response_code (200); nie działa, ponieważ alert testowy 404 https://developers.google.com/speed/pagespeed/insights/
źródło
Jeśli twoja wersja PHP nie zawiera tej funkcji:
źródło
Możemy uzyskać inną wartość zwracaną od http_response_code przez dwa różne środowiska:
W środowisku serwera WWW zwróć poprzedni kod odpowiedzi, jeśli podałeś kod odpowiedzi lub jeśli nie podasz kodu odpowiedzi, zostanie wydrukowana bieżąca wartość. Wartość domyślna to 200 (OK).
W środowisku CLI wartość true zostanie zwrócona, jeśli podałeś kod odpowiedzi, a false, jeśli nie podasz kodu odpowiedzi.
Przykład środowiska zwracającego wartość parametru Response_code dla środowiska serwera WWW:
Przykład środowiska CLI wartości zwracanej kodu odpowiedzi:
źródło