2010-06-16 20 views
39

Sto scrivendo uno script di autenticazione in PHP, per essere chiamato come API, che deve restituire 200 500` altrimenti.Come restituire un codice HTTP 500 su qualsiasi errore, non importa cosa

Il problema che sto incontrando è che php restituisce 200 in caso di condizioni di errore, emettendo invece l'errore come html. Come posso essere assolutamente sicuro che php restituirà un codice HTTP 500 a meno che non restituisca esplicitamente l'HTTP 200 o HTTP 403 da solo? In altre parole, desidero attivare tutte le avvertenze o le condizioni di errore in 500 s, senza eccezioni, in modo che il caso predefinito stia rifiutando la richiesta di autenticazione e l'eccezione lo stia approvando con un codice 200.

Ho giocato con set_error_handler() e error_reporting(), ma finora non ho avuto fortuna. Ad esempio, se il codice restituisce qualcosa prima di inviare il codice di risposta HTTP, PHP segnala naturalmente che non è possibile modificare le informazioni dell'intestazione dopo aver emesso qualcosa. Tuttavia, questo è segnalato da PHP come codice di risposta 200 con html che spiega il problema. Ho bisogno che anche questo tipo di cose sia trasformato in un codice 500.

È possibile in PHP? O devo fare questo a un livello più alto come usare mod_rewrite in qualche modo? Se è così, hai idea di come l'avrò sistemato?

+1

C'è un bug report per questo qui: http://bugs.php.net/bug.php?id=50921 - cuciture simile potrebbe essere risolto –

risposta

20

Ho controllato the PHP docs for header() ed è più semplice di quanto stavo facendo - se il secondo parametro è true, sostituirà un'intestazione simile. il valore predefinito è true Quindi il comportamento corretto è intestazione ('HTTP/1.1 403 Forbidden');, quindi eseguire la logica di autenticazione, quindi se autentica, fare intestazione ('HTTP/1.1 200 OK'). Sostituirà la risposta 403 e garantirà che 403 è l'impostazione predefinita.

+0

Bel lavoro, questa è un'ottima soluzione. – tpow

63

sufficiente inviare il codice di stato come risposta header():

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

ricordare che quando l'invio di questo c'è non deve essere qualsiasi output prima di esso. Ciò significa nessuna chiamata echo e nessun HTML o spazio bianco.

+5

Ricorda inoltre che non funzionerà se eseguito come CGI o IIS. –

+1

Grazie - so come inviare il codice di risposta, e so di non inviare l'output prima di esso, come ho menzionato nella mia domanda. La mia domanda è come impedire a PHP di inviare un codice di risposta 200 con l'errore di html in caso di errori. – Jake

+0

Invia quindi emettere il messaggio di errore? L'invio di un'intestazione di stato indica a PHP di sovrascrivere il codice di risposta predefinito '200 OK'. – BoltClock

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

Non utilizzare 500, che indica un errore interno del server.

Questo (e altre intestazioni) devono essere inviati prima di ogni uscita, tranne se è stato attivato il buffering dell'output.

+0

Grazie, ma questa non è la mia domanda. So come inviare il codice di risposta. Come posso impedire a PHP di inviare il codice 200 in caso di errori? – Jake

+0

@Jake Se invii la risposta 403, non invierà 200. Mi manca qualcosa? – Artefacto

+0

Il problema è che se si verifica una condizione di errore prima di sapere se inviare un 403 0r 200, invia un 200 con l'errore. Voglio il comportamento opposto: voglio che il valore predefinito nel caso di un errore sia 403 o 500 o più o meno qualcosa di diverso da 200, in modo che solo io invii un codice di risposta di 200. Proverò a scrivere subito il codice 403, quindi a sovrascriverlo con un 200 se riesce. Non so quale sia il comportamento dovrebbe essere in questo caso però. Qualcuno sa? Sovrascriverà correttamente il 403? – Jake

1

Utilizzare il buffer di output per consentire di modificare le intestazioni dopo aver scritto sul corpo della pagina. È possibile impostare questo nel ini file anziché aggiornare ogni script.

(Si noti la chiamata header() sarà ancora fallire se si svuota in modo esplicito il buffer di uscita)

C.

10

Nella pagina php per set_error_handler() è possibile trovare un commento di SMP a puntino ncoastsoft . com pubblicato il 08-Sep-2003 10:28, che exlpains come catturare anche errori fatali (che normalmente è possibile non interferire con un gestore di errore personalizzato ho cambiato il codice per voi ha bisogno:

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

Questa cattura shold l'errore fatale della funzione non esistente s a 500 e interrompe l'esecuzione del resto dello script.

+0

Rileverà qualsiasi errore ma analizzerà gli errori. - Inoltre, nasconderà la traccia dell'errore, quindi si potrebbe anche avere disabilitato display_errors per ottenere la stessa funzione. –

+0

@ThomasAhle puoi stampare una traccia di stack da solo dopo aver impostato le intestazioni – chacham15

1

Curioso se hai mai capito come ottenere PHP per restituire errori 500 su Parse ... Ho lo stesso esatto bisogno ... L'API sta postando sulla nostra app e si aspetta un 200 solo se tutto è stato elaborato correttamente .. .

Nel caso di un errore di analisi, PHP restituisce un errore 200 e ho usato entrambe queste funzioni:

register_shutdown_function() set_error_handler()

e questi non vengono colpiti quando un errore "parse/syntax" si verifica nel codice ...

Quindi questa è una funzione PHP di basso livello che dovrebbe essere impostata nel PHP.INI o da qualche parte ... Sto usando PHP 5.3.10 ...

9

da PHP 5.4.0 c'è un funzione specializzati non per questo http_response_code() cioè:

<?php 
    http_response_code(404); 
?> 

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

+1

Grazie per questo! Sono contento di vedere che PHP ha ora una funzione di supporto per questo genere di cose. – renoirb

+0

Sebbene sia curioso di sapere, questo non impedisce a php di restituire 200 OK quando incontra un errore. – Ellesedil

+0

sicuro, questo non è sostituto per la gestione degli errori ', è errore' segnalazione' –

Problemi correlati