PHP: Wie sende ich HTTP-Antwortcode?

Lesezeit: 9 Minuten

PHP Wie sende ich HTTP Antwortcode
Paulo Cogi

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?

  • Keine der Antworten sagt aus, was zu tun ist, nachdem header() für einen im PHP-Code erkannten 404-Fehler aufgerufen wurde. Ist exit() in Ordnung?

    – David Spector

    4. Juli 2021 um 16:57 Uhr

PHP Wie sende ich HTTP Antwortcode
verdoppeln

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

Ab PHP5.4 Es gibt drei Methoden, um dies zu erreichen:

Antwortcode selbst zusammenstellen (PHP >= 4.0)

Die header() Die Funktion hat einen speziellen Anwendungsfall, der eine HTTP-Antwortzeile erkennt und Sie diese durch eine benutzerdefinierte ersetzen lässt

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-RFCder Begründungssatz kann jede benutzerdefinierte Zeichenfolge sein (die dem Standard entspricht), aber aus Gründen der Client-Kompatibilität I nicht empfehlen, dort eine zufällige Zeichenfolge abzulegen.

Notiz: php_sapi_name() erfordert PHP 4.0.1

3. Argument für Header-Funktion (PHP >= 4.3)

Es gibt offensichtlich ein paar Probleme bei der Verwendung dieser ersten Variante. Das Größte ist meiner Meinung nach, dass es teilweise von PHP oder dem Webserver geparst und schlecht dokumentiert ist.

Seit 4.3 ist die header Die Funktion hat ein drittes Argument, mit dem Sie den Antwortcode einigermaßen bequem festlegen können, aber wenn Sie es verwenden, muss das erste Argument eine nicht leere Zeichenfolge sein. Hier sind zwei Optionen:

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

Ich empfehle die 2. Der Erste tut funktionieren auf allen Browsern, die ich getestet habe, aber einige kleinere Browser oder Webcrawler haben möglicherweise ein Problem mit einer Kopfzeile, die nur einen Doppelpunkt enthält. Der Header-Feldname im 2. Variante ist natürlich in keiner Weise standardisiert und könnte modifiziert werden, ich habe nur einen hoffentlich aussagekräftigen Namen gewählt.

http_response_code-Funktion (PHP >= 5.4)

Die http_response_code() Funktion wurde in PHP 5.4 eingeführt und hat Dinge gemacht viel 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 benötigte, aber die Funktionalität des “Neuen” wollte http_response_code Funktion. Ich glaube, PHP 4.3 ist mehr als genug abwärtskompatibel, 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;
    }
}

  • @dualed (1) würde nicht headers_sent() Seien Sie immer direkt nach dem Anruf wahr header()? (2) jemals etwas wie http_response_text() in der 5.4-Welt gefunden? Zumindest der alte Header() kann den Text nach dem Statuscode beeinflussen.

    – Bob Stein

    18. August 2013 um 20:39 Uhr

  • @BobStein-VisiBone (1) headers_sent() ist wahr, wenn Sie keine weiteren Header hinzufügen können, weil bereits Inhalt gesendet wurde, nicht, wenn Sie einen Header hinzugefügt haben. (2) Entschuldige Nein. Andere Sprachen werden jedoch besser unterstützt

    – dual

    19. August 2013 um 5:39 Uhr


  • @Perry Der Grund, warum ich dies nicht vorschlage, ist derselbe, warum ich nicht den Doppelpunkt vorschlage. PHP kann dies von Version zu Version unterschiedlich handhaben, da nicht definiert ist, was mit einem solchen “Header” passiert, es kann vollständig fehlschlagen – weder Header noch Status werden gesetzt, oder es kann einen ungültigen Header hinzufügen (der http 1.1-Protokollstandard erfordert ein Doppelpunkt)

    – dual

    16. Februar 2014 um 10:37 Uhr

  • Ich verbrachte Stunden damit, das zu realisieren http_response_code (und vielleicht allgemeiner das Ändern des Headers) funktioniert nach Ihnen nicht mehr echo etwas. Ich hoffe es hilft.

    – Neptilo

    24. Oktober 2014 um 18:33 Uhr

  • http_response_code() kann nicht verwendet werden, um benutzerdefinierte Fehlercodes zu erfinden. Zum Beispiel http_response_code(930) wird dazu führen, dass die Apache-Protokolldatei 930 korrekt anzeigt, aber tatsächlich wird ein Fehler 500 an den Client zurückgesendet. Verwenden Sie die header() Methode stattdessen für diesen zugegebenermaßen seltsamen Anwendungsfall.

    – jlh

    31. August 2016 um 7:46 Uhr

PHP Wie sende ich HTTP Antwortcode
Grigor Madalin

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

  1. Verwenden substr($sapi_type, 0, 3) == 'cgi' reicht nicht aus, um schnelles CGI zu erkennen. Bei Verwendung von PHP-FPM FastCGI Process Manager, php_sapi_name() gibt fpm zurück, nicht cgi

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

  3. header("HTTP/1.1 404 Not Found"); kann fehlschlagen, wenn das Protokoll nicht HTTP/1.1 ist (dh „HTTP/1.0“). Aktuelles Protokoll muss mit 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, der ihm aus derselben Gruppe bekannt ist. Beispielsweise wird „521 Webserver ist heruntergefahren“ 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 http_response_code() Funktion KANN 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 durch einen Benutzerkommentar erwähnt http://www.php.net/manual/en/function.http-response-code.php#112423

Zu Ihrer Information 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 anrufen:

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);
}

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 http_response_code()-Funktion löst nicht alle damit verbundenen Probleme, sondern verschlimmert die Dinge durch das Einführen neuer Fehler.

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 Bugs auf. Die schnelle CGI-Erkennung verarbeitet kein PHP-FPM. Aktuelles Protokoll muss erkannt werden.

Alle Tests und Kommentare sind willkommen.

  • Funktioniert mit PHP 8.0 / HTTP 429 Zu viele Anfragen in Gecko- und Blink-Browsern.

    – John

    18. Oktober 2021 um 5:51 Uhr

seit PHP 5.4 können Sie verwenden http_response_code() für get- und set-Header-Statuscode.

hier ein beispiel:

<?php

// Get the current response code and set a new one
var_dump(http_response_code(404));

// Get the new response code
var_dump(http_response_code());
?>

Hier ist das Dokument dieser Funktion in php.net:

http_response_code

  • Meiner Erfahrung nach ist dies die beste Antwort.

    – Schroff

    9. Juni 2018 um 23:32 Uhr


  • Warum var_dump() verwenden?

    – Tomás González

    24. Januar 2020 um 3:24 Uhr

  • Aber warum var_dump() statt echo? Kann das Ergebnis nicht für ein einfaches Echo geeignet sein? Oder sogar print_r(). var_dump() scheint für Produktionscode also nicht angemessen zu sein …

    – Tomás González

    29. Januar 2020 um 16:12 Uhr

  • @TomasGonzalez, es ist keine große Sache, ich wollte dir nur zeigen, was drin ist, indem ich alles mit var_dump() drucke, und du hast Recht, sie sind nicht wichtig

    – Seyed Ali Roshan

    31. Januar 2020 um 18:53 Uhr

  • OK, ich verstehe. Was meine Aufmerksamkeit erregt hat, ist, dass das Beispiel in den offiziellen Dokumenten auch var_dump() verwendet. Daher war ich neugierig auf den Grund dafür. Es könnte etwas gewesen sein, das mir gefehlt hat. php.net/manual/en/function.http-response-code.php

    – Tomás González

    1. Februar 2020 um 14:56 Uhr

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

header("HTTP/1.1 200 OK");

Ersetzen Sie den Nachrichtenteil (“OK”) durch die entsprechende Nachricht und den Statuscode durch Ihren entsprechenden Code (404, 501 usw.).

Wenn Sie hier sind, weil WordPress beim Laden der Umgebung 404 ausgibt, sollte dies das Problem beheben:

define('WP_USE_THEMES', false);
require('../wp-blog-header.php');
status_header( 200 );
//$wp_query->is_404=false; // if necessary

Das Problem liegt daran, dass der Header Status: 404 Not Found gesendet wird. Das musst du überschreiben. Das wird auch funktionieren:

define('WP_USE_THEMES', false);
require('../wp-blog-header.php');
header("HTTP/1.1 200 OK");
header("Status: 200 All rosy");

1646930049 328 PHP Wie sende ich HTTP Antwortcode
QUentin

Mit dem Header Funktion. Es gibt ein Beispiel im Abschnitt über den ersten Parameter, den es braucht.

1646930050 989 PHP Wie sende ich HTTP Antwortcode
Abdo-Host

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

<?php

function http_response_code($code = NULL) {
        if ($code !== NULL) {
            switch ($code) {
                case 100: $text="Continue";
                    break;
                case 101: $text="Switching Protocols";
                    break;
                case 200: $text="OK";
                    break;
                case 201: $text="Created";
                    break;
                case 202: $text="Accepted";
                    break;
                case 203: $text="Non-Authoritative Information";
                    break;
                case 204: $text="No Content";
                    break;
                case 205: $text="Reset Content";
                    break;
                case 206: $text="Partial Content";
                    break;
                case 300: $text="Multiple Choices";
                    break;
                case 301: $text="Moved Permanently";
                    break;
                case 302: $text="Moved Temporarily";
                    break;
                case 303: $text="See Other";
                    break;
                case 304: $text="Not Modified";
                    break;
                case 305: $text="Use Proxy";
                    break;
                case 400: $text="Bad Request";
                    break;
                case 401: $text="Unauthorized";
                    break;
                case 402: $text="Payment Required";
                    break;
                case 403: $text="Forbidden";
                    break;
                case 404: $text="Not Found";
                    break;
                case 405: $text="Method Not Allowed";
                    break;
                case 406: $text="Not Acceptable";
                    break;
                case 407: $text="Proxy Authentication Required";
                    break;
                case 408: $text="Request Time-out";
                    break;
                case 409: $text="Conflict";
                    break;
                case 410: $text="Gone";
                    break;
                case 411: $text="Length Required";
                    break;
                case 412: $text="Precondition Failed";
                    break;
                case 413: $text="Request Entity Too Large";
                    break;
                case 414: $text="Request-URI Too Large";
                    break;
                case 415: $text="Unsupported Media Type";
                    break;
                case 500: $text="Internal Server Error";
                    break;
                case 501: $text="Not Implemented";
                    break;
                case 502: $text="Bad Gateway";
                    break;
                case 503: $text="Service Unavailable";
                    break;
                case 504: $text="Gateway Time-out";
                    break;
                case 505: $text="HTTP Version not supported";
                    break;
                default:
                    exit('Unknown http status code "' . htmlentities($code) . '"');
                    break;
            }
            $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
            header($protocol . ' ' . $code . ' ' . $text);
            $GLOBALS['http_response_code'] = $code;
        } else {
            $code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);
        }
        return $code;
    }

988460cookie-checkPHP: Wie sende ich HTTP-Antwortcode?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy