Frage

Ich habe ein PHP-Skript, das Antworten mit HTTP-Antwortcodes (Statuscodes) wie HTTP 200 OK oder einem 4XX- oder 5XX-Code geben muss.

Wie kann ich das in PHP machen?

War es hilfreich?

Lösung

Ich habe gerade diese Frage gefunden und dachte, sie bedarf einer umfassenderen Antwort:

Ab PHP 5.4 Es gibt drei Methoden, dies zu erreichen:

Den Antwortcode selbst zusammenstellen (PHP >= 4.0)

Der header() Die Funktion verfügt über einen speziellen Anwendungsfall, der eine HTTP-Antwortzeile erkennt und es Ihnen ermöglicht, diese durch eine benutzerdefinierte zu ersetzen

header("HTTP/1.1 200 OK");

Dies erfordert jedoch eine besondere Behandlung für (Fast)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");

Notiz: Entsprechend der HTTP-RFC, Die Grundphrase kann eine beliebige benutzerdefinierte Zeichenfolge sein (die dem Standard entspricht), aber aus Gründen der Clientkompatibilität I nicht Ich empfehle, dort eine zufällige Zeichenfolge einzufügen.

Notiz: php_sapi_name() erfordert PHP 4.0.1

3. Argument zur Header-Funktion (PHP >= 4.3)

Bei der Verwendung dieser ersten Variante gibt es offensichtlich einige Probleme.Das größte Problem ist meiner Meinung nach, dass es teilweise von PHP oder dem Webserver analysiert und schlecht dokumentiert wird.

Seit 4.3 ist die header Die Funktion verfügt über ein drittes Argument, mit dem Sie den Antwortcode einigermaßen bequem festlegen können. Für die Verwendung muss das erste Argument jedoch eine nicht leere Zeichenfolge sein.Hier gibt es zwei Möglichkeiten:

header(':', true, 404);
header('X-PHP-Response-Code: 404', true, 404);

Ich empfehle den 2..Der erste tut Funktioniert mit 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 Header-Feldes im 2.Variante ist natürlich in keiner Weise standardisiert und könnte geändert werden, ich habe nur einen hoffentlich aussagekräftigen Namen gewählt.

http_response_code-Funktion (PHP >= 5.4)

Der http_response_code() Die Funktion wurde in PHP 5.4 eingeführt und hat Dinge bewirkt eine Menge Einfacher.

http_response_code(404);

Das ist alles.

Kompatibilität

Hier ist eine Funktion, die ich mir ausgedacht habe, als ich Kompatibilität unter 5.4 brauchte, aber die Funktionalität des „neuen“ wollte http_response_code Funktion.Ich glaube, dass PHP 4.3 mehr als genug Abwärtskompatibilität bietet, aber man weiß ja 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;
    }
}

Andere Tipps

Leider habe ich festgestellt, dass die von @dualed vorgestellten Lösungen verschiedene Mängel aufweisen.

  1. Benutzen substr($sapi_type, 0, 3) == 'cgi' reicht nicht aus, um schnelles CGI zu erkennen.Wenn Sie PHP-FPM FastCGI Process Manager verwenden, php_sapi_name() gibt fpm und nicht cgi zurück

  2. Fasctcgi und php-fpm legen einen weiteren von @Josh erwähnten Fehler offen – using header('X-PHP-Response-Code: 404', true, 404); funktioniert ordnungsgemäß unter PHP-FPM (FastCGI)

  3. header("HTTP/1.1 404 Not Found"); kann fehlschlagen, wenn das Protokoll nicht HTTP/1.1 ist (d. h.„HTTP/1.0“).Das aktuelle Protokoll muss mithilfe erkannt werden $_SERVER['SERVER_PROTOCOL'] (verfügbar seit PHP 4.1.0

  4. Beim Anruf gibt es mindestens 2 Fälle http_response_code() zu unerwartetem Verhalten führen:

    • Wenn PHP auf einen HTTP-Antwortcode stößt, den es nicht versteht, ersetzt PHP den Code durch einen Code, den es aus derselben Gruppe kennt.Beispielsweise wird „521 Webserver ist ausgefallen“ durch „500 Interner Serverfehler“ ersetzt.Viele andere ungewöhnliche Antwortcodes aus anderen Gruppen 2xx, 3xx, 4xx werden auf diese Weise behandelt.
    • Auf einem Server mit PHP-FPM und Nginx kann die Funktion http_response_code() den Code wie erwartet ändern, aber nicht die Nachricht.Dies kann beispielsweise zu einem seltsamen „404 OK“-Header führen.Dieses Problem wird auch auf der PHP-Website in einem Benutzerkommentar erwähnt http://www.php.net/manual/en/function.http-response-code.php#112423

Als Referenz finden Sie hier die vollständige Liste der HTTP-Antwortstatuscodes (diese Liste enthält Codes aus IETF-Internetstandards sowie anderen 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:

http_response_code(521);

Der Server sendet den HTTP-Antwortcode „500 Internal Server Error“, was zu unerwarteten Fehlern führt, wenn Sie beispielsweise eine benutzerdefinierte Clientanwendung haben, die Ihren Server anruft und einige zusätzliche HTTP-Codes erwartet.


Meine Lösung (für alle PHP-Versionen seit 4.1.0):

$httpStatusCode = 521;
$httpStatusMsg  = 'Web server is down';
$phpSapiName    = substr(php_sapi_name(), 0, 3);
if ($phpSapiName == 'cgi' || $phpSapiName == 'fpm') {
    header('Status: '.$httpStatusCode.' '.$httpStatusMsg);
} else {
    $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
    header($protocol.' '.$httpStatusCode.' '.$httpStatusMsg);
}

Abschluss

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 sie aber noch, indem sie neue Fehler einführt.

Die von @dualed angebotene „Kompatibilitäts“-Lösung funktioniert zumindest unter PHP-FPM nicht wie erwartet.

Auch die anderen von @dualed angebotenen Lösungen weisen diverse Fehler auf.Die schnelle CGI-Erkennung unterstützt PHP-FPM nicht.Das aktuelle Protokoll muss erkannt werden.

Alle Tests und Kommentare sind willkommen.

Seit php 5.4 können Sie den generationspflichtigen Statuscode des Header-Statuscodes verwenden.

hier ein Beispiel:

generasacodicetagpre.

Hier ist das Dokument dieser Funktion in php.net:

http_response_code

Fügen Sie diese Zeile vor jeder Ausgabe des Körpers hinzu, falls Sie keine Ausgabepufferung verwenden.

generasacodicetagpre.

Ersetzen Sie den Nachrichtenabschnitt ('OK') durch die entsprechende Nachricht und den Statuscode mit Ihrem Code entsprechend (404, 501 usw.)

Wenn Sie hier wegen WordPress sind, die beim Laden der Umgebung 404 geben, sollte dies das Problem beheben:

generasacodicetagpre.

Das Problem ist darauf zurückzuführen, dass er einen Status sendet: 404 nicht gefunden Header.Sie müssen das überschreiben. Dies wird auch funktionieren:

generasacodicetagpre.

mit dem header Funktion.Es gibt ein Beispiel im Abschnitt des ersten Parameters, den es dauert.

Wenn Ihre Version von PHP diese Funktion nicht enthält:

generasacodicetagpre.

We can get different return value from http_response_code via the two different environment:

  1. Web Server Environment
  2. CLI environment

At the web server environment, return previous response code if you provided a response code or when you do not provide any response code then it will be print the current value. Default value is 200 (OK).

At CLI Environment, true will be return if you provided a response code and false if you do not provide any response_code.

Example of Web Server Environment of Response_code's return value:

var_dump(http_respone_code(500)); // int(200)
var_dump(http_response_code()); // int(500)

Example of CLI Environment of Response_code's return value:

var_dump(http_response_code()); // bool(false)
var_dump(http_response_code(501)); // bool(true)
var_dump(http_response_code()); // int(501)
header("HTTP/1.1 200 OK");
http_response_code(201);
header("Status: 200 All rosy");

http_response_code(200); not work because test alert 404 https://developers.google.com/speed/pagespeed/insights/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top