PHP: come inviare il codice di risposta HTTP?


Risposte:


461

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:

Assemblando il codice di risposta da soli (PHP> = 4.0)

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

3 ° argomento alla funzione header (PHP> = 4.3)

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 headerfunzione 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.

funzione http_response_code (PHP> = 5.4)

La http_response_code()funzione è stata introdotta in PHP 5.4 e ha reso le cose molto più semplici.

http_response_code(404);

È tutto.

Compatibilità

Ecco una funzione che ho elaborato quando avevo bisogno di compatibilità sotto 5.4 ma volevo la funzionalità della "nuova" http_response_codefunzione. 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;
    }
}

10
Posso confermare che header('X-PHP-Response-Code: 404', true, 404);funziona correttamente con PHP-FPM (FastCGI)
Josh

@dualed (1) non sarebbe 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.
Bob Stein,

@ BobStein-VisiBone (1) 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ò
raddoppiato il

1
@Perry il motivo per cui non suggerisco di farlo è lo stesso per cui non suggerisco quello solo per i due punti. PHP può gestirlo in modo diverso in tutte le versioni, poiché non è definito ciò che accade con una tale "intestazione", potrebbe non riuscire completamente - non impostando né l'intestazione né lo stato, oppure potrebbe aggiungere un'intestazione non valida (lo standard del protocollo http 1.1 richiede due punti )
raddoppiato il

8
Ho passato ore a capire che http_response_code(e forse più in generale modificando l'intestazione) non funziona più dopo di te echoqualcosa. Spero che sia d'aiuto.
Neptilo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.