2010-06-16 3 views
39

Ich schreibe ein Authentifizierungsskript in PHP, um als eine API aufgerufen zu werden, die andernfalls 200 ' 500' zurückgeben muss.Wie man einen HTTP 500-Code bei irgendeinem Fehler zurückgibt, egal was

Das Problem, das ich renne ist, dass PHP 200 im Falle von Fehlerbedingungen zurückgibt, die Ausgabe des Fehlers als HTML stattdessen. Wie kann ich absolut sicher gehen, dass PHP einen HTTP 500 Code zurückgibt, wenn ich das HTTP 200 oder HTTP 403 nicht selbst zurückgebe? Mit anderen Worten, ich möchte alle und alle Warn- oder Fehlerbedingungen in 500s, keine Ausnahmen, umwandeln, so dass der Standardfall die Authentifizierungsanforderung zurückweist und die Ausnahme diese mit einem Code 200 genehmigt.

Ich habe mit set_error_handler() und error_reporting() fiedled, 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 Response-Code mit HTML zur Erläuterung des Problems gemeldet. Ich muss sogar diese Art von Ding in einen 500 Code umgewandelt werden.

Ist das in PHP möglich? Oder muss ich das auf einer höheren Ebene tun, wie mod_rewrite irgendwie zu verwenden? Wenn das der Fall ist, irgendeine Idee, wie ich das einrichten würde?

+1

es gibt einen Fehlerbericht für das hier: http://bugs.php.net/bug.php?id=50921 - Nähte es, wie es kann behoben werden. –

Antwort

20

Ich überprüfte the PHP docs for header(), und es ist einfacher als ich es machte - wenn der zweite Parameter wahr ist, wird es einen ähnlichen Header ersetzen. Der Standardwert ist wahr. Also das richtige Verhalten ist Header ('HTTP/1.1 403 Forbidden');, dann die Authentifizierungslogik, dann, wenn es authentifiziert, tun Header ('HTTP/1.1 200 OK'). Es ersetzt die 403-Antwort und garantiert, dass 403 die Standardeinstellung ist.

+0

Nice Arbeit, das ist eine ausgezeichnete Lösung. – tpow

63

einfach den Statuscode als Antwort senden header():

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

Denken Sie daran, dass, wenn diese dort zu senden darf nicht, bevor es noch ausgegeben werden. Das heißt, keine echo Aufrufe und kein HTML oder Leerzeichen.

+5

Denken Sie auch daran, dass dies nicht funktioniert, wenn es als CGI oder unter IIS läuft. –

+1

Danke - Ich weiß, wie man den Antwortcode sendet, und ich weiß, keine Ausgabe davor zu senden, wie ich in meiner Frage erwähnte. Meine Frage ist, wie verhindert werden kann, dass PHP im Fehlerfall einen 200er Response Code mit dem Fehler als HTML sendet. – Jake

+0

Senden Sie es dann die Fehlermeldung ausgeben? Durch das Senden eines Status-Headers wird PHP angewiesen, den standardmäßigen Antwortcode "200 OK" zu überschreiben. – BoltClock

5
header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden'); 

Sie sollten nicht 500 verwenden, das einen internen Serverfehler anzeigt.

Diese (und andere Header) sollten vor jeder Ausgabe gesendet werden, außer wenn die Ausgabepufferung aktiviert ist.

+0

Danke, aber das ist nicht meine Frage. Ich kann den Antwortcode senden. Wie verhindere ich, dass PHP im Fehlerfall den 200-Code sendet? – Jake

+0

@Jake Wenn die Antwort 403 gesendet wird, sendet sie nicht 200. Fehle ich etwas? – Artefacto

+0

Das Problem ist, dass, wenn es in einen Fehler Zustand läuft, bevor ich weiß, ob eine 403 0r 200 senden, sendet es eine 200 mit dem Fehler. Ich möchte das entgegengesetzte Verhalten - ich möchte die Standardeinstellung im Falle eines Fehlers 403 oder 500 oder so ziemlich alles andere als 200, so dass nur ich einen 200 Antwortcode senden. Ich werde versuchen, den 403-Code sofort zu schreiben, und überschreiben dann das mit einer 200, wenn es erfolgreich ist. Ich weiß nicht, wie das Verhalten in diesem Fall sein soll. Weiß jemand? Wird es die 403 korrekt überschreiben? – Jake

1

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

(Beachten Sie die header() Anruf wird noch fehlschlagen, wenn Sie explizit den Ausgabepuffer spülen)

C.

10

Auf der PHP-Seite für set_error_handler() Sie einen Kommentar von smp bei ncoastsoft Punkt finden . com am 08-Sep-2003 10.28 veröffentlicht, die exlpains wie auch fatale Fehler fangen (die man normalerweise nicht mit einem benutzerdefinierten Fehlerhandler ertappe ich für Sie den Code geändert braucht:

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

diese SHOLD Fang der fatale Fehler der nicht existierenden Funktion s a 500 und stoppt die Ausführung des Rests des Skripts.

+0

Es wird jeden Fehler abfangen, aber Fehler analysieren. - Es wird auch die Fehler-Trace ausblenden, so dass Sie Display_Fehler genauso hätte deaktivieren können, um die gleiche Funktion zu erhalten. –

+0

@ThomasAhle können Sie eine Stack-Trace selbst ausgeben, nachdem Sie die Header – chacham15

1

Neugierig, wenn Sie jemals herausgefunden haben, wie PHP 500 auf Parse-Fehler zurückzugeben ... Ich habe die gleiche genaue Notwendigkeit ... API wird in unserer App und erwartet eine 200 nur, wenn alles korrekt verarbeitet wurde .. . im Falle eines Fehlers Parse

, gibt PHP einen Fehler 200, und ich habe beide Funktionen verwendet:

register_shutdown_function() set_error_handler()

und diese nicht schlagen werden, wenn ein "parse/syntax" -Fehler passiert im Code ...

Also das ist eine Low-Level-PHP-Funktion, die in der PHP.INI oder irgendwo eingestellt werden müsste ... Ich benutze PHP 5.3.10 ...

9

seit PHP 5.4.0 gibt es eine spezialized Funktion für das http_response_code() dh:

<?php 
    http_response_code(404); 
?> 

siehe http://www.php.net/manual/en/function.http-response-code.php

+1

Danke dafür! Ich bin froh zu sehen, dass PHP jetzt eine Hilfsfunktion für diese Art von Dingen hat. – renoirb

+0

Obwohl es gut zu wissen ist, hört php nicht auf, ein 200 OK zurückzugeben, wenn ein Fehler auftritt. – Ellesedil

+0

sicher, das ist kein Ersatz für den Fehler 'handling', es ist der Fehler' Reporting' –

Verwandte Themen