wake-up-neo.com

So geben Sie bei jedem Fehler einen HTTP 500-Code zurück, egal was passiert

Ich schreibe ein Authentifizierungsskript in PHP, um es als API aufzurufen, das andernfalls 200 only in the case that it approves the request, and 403 (Forbidden) or 500` zurückgeben muss.

Das Problem, auf das ich stoße, ist, dass PHP im Falle von Fehlerbedingungen 200 Zurückgibt und den Fehler stattdessen als HTML ausgibt. Wie kann ich absolut sicherstellen, dass PHP einen HTTP-Code 500 Zurückgibt, es sei denn, ich gebe den HTTP-Code 200 Oder den HTTP-Code 403 Ausdrücklich selbst zurück? Mit anderen Worten, ich möchte alle Warnungs- oder Fehlerbedingungen in 500 Umwandeln, ohne Ausnahmen, sodass der Standardfall die Authentifizierungsanforderung ablehnt und die Ausnahme sie mit einem 200 Code.

Ich habe mit set_error_handler() und error_reporting() herumgespielt, aber bisher kein Glück. Wenn der Code beispielsweise etwas ausgibt, bevor ich den HTTP-Antwortcode sende, meldet PHP natürlich, dass Sie die Header-Informationen nach der Ausgabe nicht ändern können. Dies wird jedoch von PHP als 200 - Antwortcode mit HTML-Code zur Erläuterung des Problems gemeldet. Ich brauche sogar solche Dinge, um sie in einen 500 - Code umzuwandeln.

Ist das in PHP möglich? Oder muss ich das auf einer höheren Ebene machen, wie etwa mit mod_rewrite? Wenn das der Fall ist, wie würde ich das einrichten?

45
Jake

Ich habe das PHP docs for header () , und es ist einfacher als ich es gemacht habe - wenn der zweite Parameter wahr ist, wird es einen ähnlichen Header ersetzen Der Standardwert ist true. Das richtige Verhalten ist also der Header ('HTTP/1.1 403 Forbidden');. Führen Sie dann die Authentifizierungslogik aus. Wenn er authentifiziert wird, führen Sie den Header ('HTTP/1.1 200 OK') aus. Er ersetzt die Antwort 403 und stellt sicher, dass dies der Fall ist der Standard.

20
Jake

Senden Sie einfach den Statuscode als Antwort header() :

header('HTTP/1.1 500 Internal Server Error');

Denken Sie daran, dass beim Senden keine Ausgabe davor sein darf . Das bedeutet keine echo Aufrufe und kein HTML oder Whitespace.

75
BoltClock

Seit PHP 5.4.0 gibt es eine spezielle Funktion:

<?php http_response_code( 500 ); ?>

Stellen Sie sicher, dass es vor jeder anderen Ausgabe aufgerufen wird.

Referenz:

15
Martin M

Auf der PHP-Seite für set_error_handler () finden Sie einen Kommentar von smp unter ncoastsoft dot com, der am 08.09.2003 um 10:28 Uhr veröffentlicht wurde und erläutert, wie Sie sogar schwerwiegende Fehler abfangen können (die Sie normalerweise nicht mit einem benutzerdefinierten Fehlerhandler abfangen können. Ich habe den Code für Sie geändert:

error_reporting(E_ALL);
ini_set('display_errors', 'on');

function fatal_error_handler($buffer) {
    header('HTTP/1.1 500 Internal Server Error');
    exit(0);
}

function handle_error ($errno, $errstr, $errfile, $errline){
    header('HTTP/1.1 500 Internal Server Error');
    exit(0);
}

ob_start("fatal_error_handler");
set_error_handler("handle_error");

//would normally cause a fatal error, but instead our output handler will be called allowing us to handle the error.
somefunction();
ob_end_flush();

Dies sollte den schwerwiegenden Fehler der nicht existierenden Funktion auffangen. Es gibt dann eine 500 zurück und stoppt die Ausführung des restlichen Skripts.

11
2ndkauboy
header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');

Sie sollten nicht 500 verwenden, da dies auf einen internen Serverfehler hinweist.

Dieser (und andere Header) sollten vor jeder Ausgabe gesendet werden, es sei denn, Sie haben die Ausgabepufferung aktiviert.

4
Artefacto

Neugierig, wenn Sie jemals herausgefunden haben, wie Sie PHP um 500 bei Parse-Fehlern zurückzugeben ... Ich habe genau das gleiche Bedürfnis ... API wird in unsere App gepostet und erwartet nur dann 200, wenn alles wurde korrekt verarbeitet ...

Im Fall eines Parse-Fehlers gibt PHP einen Fehler 200 zurück, und ich habe beide dieser Funktionen verwendet:

register_shutdown_function () set_error_handler ()

und diese werden nicht getroffen, wenn im Code ein Fehler "parse/syntax" auftritt ...

Das ist also eine einfache PHP Funktion, die in der PHP.INI oder irgendwo anders eingestellt werden müsste ... Ich verwende PHP= 5.3.10 ...

2
Patrick Steil

Verwenden Sie die Ausgabepufferung, um die Header nach dem Schreiben in den Hauptteil der Seite zu ändern. Sie können dies in der ini-Datei einstellen, anstatt jedes Skript zu aktualisieren.

(Beachten Sie, dass der Aufruf von header () immer noch fehlschlägt, wenn Sie den Ausgabepuffer explizit leeren.)

C.

1
symcbean