Ho uno script PHP che deve fornire risposte con codici di risposta HTTP (codici di stato), come HTTP 200 OK o un codice 4XX o 5XX.
Come posso farlo in PHP?
Ho uno script PHP che deve fornire risposte con codici di risposta HTTP (codici di stato), come HTTP 200 OK o un codice 4XX o 5XX.
Come posso farlo in PHP?
Risposte:
Ho appena trovato questa domanda e ho pensato che avesse bisogno di una risposta più completa:
A partire da PHP 5.4 ci sono tre metodi per ottenere questo risultato:
La header()
funzione ha un caso d'uso speciale che rileva una riga di risposta HTTP e consente di sostituirla con una personalizzata
header("HTTP/1.1 200 OK");
Tuttavia, ciò richiede un trattamento speciale per PHP (veloce) CGI:
$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");
Nota: secondo HTTP RFC , la frase di motivazione può essere qualsiasi stringa personalizzata (conforme allo standard), ma per motivi di compatibilità del client non consiglio di inserire una stringa casuale lì.
Nota: php_sapi_name()
richiede PHP 4.0.1
Ovviamente ci sono alcuni problemi quando si utilizza quella prima variante. Il più grande dei quali penso sia che è parzialmente analizzato da PHP o dal web server e scarsamente documentato.
Dalla 4.3, la header
funzione ha un terzo argomento che consente di impostare il codice di risposta in modo abbastanza comodo, ma utilizzarlo richiede che il primo argomento sia una stringa non vuota. Ecco due opzioni:
header(':', true, 404);
header('X-PHP-Response-Code: 404', true, 404);
Raccomando il secondo . Il primo fa il lavoro su tutti i browser che ho provato, ma alcuni browser minori o web crawler potrebbe avere un problema con una riga di intestazione che contiene solo due punti. Il nome del campo dell'intestazione nel secondo. la variante ovviamente non è standardizzata in alcun modo e potrebbe essere modificata, ho solo scelto un nome che si spera descrittivo.
La http_response_code()
funzione è stata introdotta in PHP 5.4 e ha reso le cose molto più semplici.
http_response_code(404);
È tutto.
Ecco una funzione che ho elaborato quando avevo bisogno di compatibilità sotto 5.4 ma volevo la funzionalità della "nuova" http_response_code
funzione. Credo che PHP 4.3 sia più che sufficiente compatibilità all'indietro, ma non si sa mai ...
// 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;
}
}
headers_sent()
sempre vero subito dopo aver chiamato header()
? (2) hai mai trovato qualcosa come http_response_text () nel mondo 5.4? Almeno la vecchia intestazione () può influire sul testo dopo il codice di stato.
headers_sent()
è vero se non puoi aggiungere altre intestazioni perché il contenuto è già stato inviato, non se hai aggiunto un'intestazione. (2) Spiacente, no. Altre lingue hanno un supporto migliore però
http_response_code
(e forse più in generale modificando l'intestazione) non funziona più dopo di te echo
qualcosa. Spero che sia d'aiuto.
header('X-PHP-Response-Code: 404', true, 404);
funziona correttamente con PHP-FPM (FastCGI)