Ich habe ein PHP-Skript, das Antworten mit HTTP-Antwortcodes (Statuscodes) wie HTTP 200 OK oder einem 4XX- oder 5XX-Code erstellen muss.
Wie kann ich das in PHP machen?
quelle
Ich habe ein PHP-Skript, das Antworten mit HTTP-Antwortcodes (Statuscodes) wie HTTP 200 OK oder einem 4XX- oder 5XX-Code erstellen muss.
Wie kann ich das in PHP machen?
Ich habe gerade diese Frage gefunden und dachte, sie braucht eine umfassendere Antwort:
Ab PHP 5.4 gibt es drei Methoden, um dies zu erreichen:
Die header()
Funktion hat einen speziellen Anwendungsfall, der eine HTTP-Antwortzeile erkennt und Sie durch eine benutzerdefinierte ersetzen kann
header("HTTP/1.1 200 OK");
Dies erfordert jedoch eine spezielle Behandlung für (schnelles) 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");
Hinweis: Laut HTTP-RFC kann die Grundphrase eine beliebige benutzerdefinierte Zeichenfolge sein (die dem Standard entspricht). Aus Gründen der Clientkompatibilität empfehle ich jedoch nicht , dort eine zufällige Zeichenfolge einzufügen.
Hinweis: php_sapi_name()
erfordert PHP 4.0.1
Es gibt offensichtlich einige Probleme bei der Verwendung dieser ersten Variante. Das größte davon ist meiner Meinung nach, dass es teilweise von PHP oder dem Webserver analysiert und schlecht dokumentiert wird.
Seit 4.3 verfügt die header
Funktion über ein drittes Argument, mit dem Sie den Antwortcode etwas bequemer festlegen können. Für die Verwendung dieses Codes muss das erste Argument jedoch eine nicht leere Zeichenfolge sein. Hier sind zwei Möglichkeiten:
header(':', true, 404);
header('X-PHP-Response-Code: 404', true, 404);
Ich empfehle die zweite ein . Der erste funktioniert in allen von mir getesteten Browsern, aber einige kleinere Browser oder Webcrawler haben möglicherweise ein Problem mit einer Kopfzeile, die nur einen Doppelpunkt enthält. Der Name des Headerfeldes im 2 .. Variante ist natürlich in keiner Weise standardisiert und könnte modifiziert werden, ich habe nur einen hoffentlich beschreibenden Namen gewählt.
Die http_response_code()
Funktion wurde in PHP 5.4 eingeführt und hat die Sache viel einfacher gemacht.
http_response_code(404);
Das ist alles.
Hier ist eine Funktion, die ich mir ausgedacht habe, als ich Kompatibilität unter 5.4 benötigte, aber die Funktionalität der "neuen" http_response_code
Funktion wollte. Ich glaube, PHP 4.3 ist mehr als genug Abwärtskompatibilität, aber man weiß nie ...
// 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);
dies unter PHP-FPM (FastCGI) ordnungsgemäß funktioniertheaders_sent()
immer gleich nach dem Anruf wahr seinheader()
? (2) jemals etwas wie http_response_text () in der 5.4-Welt gefunden? Zumindest der alte Header () kann den Text nach dem Statuscode beeinflussen.headers_sent()
ist wahr, wenn Sie keine weiteren Header hinzufügen können, weil der Inhalt bereits gesendet wurde, und nicht, wenn Sie einen Header hinzugefügt haben. (2) Entschuldigung, nein. Andere Sprachen haben jedoch eine bessere Unterstützunghttp_response_code
(und vielleicht allgemeiner das Ändern des Headers) nach Ihnenecho
etwas nicht mehr funktioniert . Ich hoffe es hilft.Leider habe ich festgestellt, dass die von @dualed vorgestellten Lösungen verschiedene Mängel aufweisen.
Die Verwendung
substr($sapi_type, 0, 3) == 'cgi'
ist nicht ausreichend, um schnelles CGI zu erkennen. Bei Verwendung von PHP-FPM FastCGI Process Manager wirdphp_sapi_name()
fpm nicht cgi zurückgegebenFasctcgi und php-fpm decken einen weiteren von @Josh erwähnten Fehler auf - die Verwendung
header('X-PHP-Response-Code: 404', true, 404);
funktioniert unter PHP-FPM (FastCGI) ordnungsgemäß.header("HTTP/1.1 404 Not Found");
kann fehlschlagen, wenn das Protokoll nicht HTTP / 1.1 ist (dh 'HTTP / 1.0'). Das aktuelle Protokoll muss mit$_SERVER['SERVER_PROTOCOL']
(verfügbar seit PHP 4.1.0) erkannt werdenEs gibt mindestens zwei Fälle, in denen ein Anruf
http_response_code()
zu unerwartetem Verhalten führt:Als Referenz finden Sie hier die vollständige Liste der HTTP-Antwortstatuscodes (diese Liste enthält Codes aus IETF-Internetstandards sowie andere IETF-RFCs. Viele von ihnen werden derzeit NICHT von der PHP-Funktion http_response_code unterstützt): http: //en.wikipedia .org / wiki / List_of_HTTP_status_codes
Sie können diesen Fehler einfach testen, indem Sie Folgendes aufrufen:
Der Server sendet den HTTP-Antwortcode "500 Internal Server Error", der zu unerwarteten Fehlern führt, wenn beispielsweise eine benutzerdefinierte Clientanwendung Ihren Server aufruft und einige zusätzliche HTTP-Codes erwartet.
Meine Lösung (für alle PHP-Versionen seit 4.1.0):
Fazit
Die Implementierung von http_response_code () unterstützt nicht alle HTTP-Antwortcodes und überschreibt möglicherweise den angegebenen HTTP-Antwortcode mit einem anderen aus derselben Gruppe.
Die neue Funktion http_response_code () löst nicht alle damit verbundenen Probleme, verschlimmert jedoch die Einführung neuer Fehler.
Die von @dualed angebotene "Kompatibilitäts" -Lösung funktioniert zumindest unter PHP-FPM nicht wie erwartet.
Die anderen von @dualed angebotenen Lösungen weisen ebenfalls verschiedene Fehler auf. Die schnelle CGI-Erkennung unterstützt kein PHP-FPM. Das aktuelle Protokoll muss erkannt werden.
Alle Tests und Kommentare sind willkommen.
quelle
Seit PHP 5.4 können Sie
http_response_code()
den Header-Statuscode abrufen und festlegen.hier ein Beispiel:
Hier ist das Dokument dieser Funktion in php.net:
http_response_code
quelle
Fügen Sie diese Zeile vor jeder Ausgabe des Körpers hinzu, falls Sie keine Ausgabepufferung verwenden.
Ersetzen Sie den Nachrichtenteil ('OK') durch die entsprechende Nachricht und den Statuscode durch Ihren entsprechenden Code (404, 501 usw.).
quelle
Wenn Sie hier sind, weil Wordpress beim Laden der Umgebung 404 gibt, sollte dies das Problem beheben:
Das Problem ist darauf zurückzuführen, dass ein Status: 404 Not Found-Header gesendet wird. Das muss man außer Kraft setzen. Dies wird auch funktionieren:
quelle
Mit der Header- Funktion. Im Abschnitt über den ersten Parameter finden Sie ein Beispiel.
quelle
http_response_code (200); funktioniert nicht, weil Testalarm 404 https://developers.google.com/speed/pagespeed/insights/
quelle
Wenn Ihre PHP-Version diese Funktion nicht enthält:
quelle
Wir können unterschiedliche Rückgabewerte von http_response_code über die zwei verschiedenen Umgebungen erhalten:
Geben Sie in der Webserverumgebung den vorherigen Antwortcode zurück, wenn Sie einen Antwortcode angegeben haben oder wenn Sie keinen Antwortcode angeben, wird der aktuelle Wert gedruckt. Der Standardwert ist 200 (OK).
In der CLI-Umgebung wird true zurückgegeben, wenn Sie einen Antwortcode angegeben haben, und false, wenn Sie keinen Antwortcode angegeben haben.
Beispiel für eine Webserverumgebung mit dem Rückgabewert von Response_code:
Beispiel für die CLI-Umgebung des Rückgabewerts von Response_code:
quelle