L’errore di PHP cannot modify header information – headers already sent si verifica quando si invia un output (ad esempio una stringa o un carattere) prima di inviare le intestazioni HTTP.
Cosa sono le intestazioni HTTP?
Le intestazioni HTTP sono un elemento importante della comunicazione tra il server e il browser e devono essere inviate obbligatoriamente prima di qualsiasi altro output.
In altre parole: quando il server risponde alla richiesta del browser per prima cosa invia le intestazioni HTTP e poi il contenuto della risorsa richiesta (ad esempio il codice HTML di una pagina web).
Le intestazioni HTTP forniscono informazioni sul contenuto della richiesta (del browser) e della risposta (del server) come il tipo di contenuto, la lingua, la data e l’ora, le informazioni sul browser e sulla cache, e molte altre informazioni utili per il corretto funzionamento delle scambio di dati tra client e server.
Ad esempio, l’intestazione "Content-Type" specifica il tipo di contenuto che viene inviato dal server al browser, mentre l’intestazione "Accept-Language" specifica la lingua preferita del browser per la risposta.
Le intestazioni HTTP (olte ad essere un elemento importante del protocollo) sono importanti per migliorare la sicurezza, e personalizzare l’esperienza dell’utente (ad esempio mediante le intestaztioni HTTP è possibile impostare dei redirect automatici).
Quando si verifica l’errore cannot modify header information – headers already sent?
Come detto questo errore delle pagine PHP si verifica quando, per un errore di programmazione, il server prova ad inviare una intestazione HTTP dopo aver già trasmesso un output.
L’errore, tradotto letteralmente, ci dice che "non è possibile modificare le intestazioni HTTP perche le intestazioni sono già state inviate". Quando lo script produce un output, infatti, le intestazioni sono già state trasmesse e non è più possibile modificarle.
Ecco un esempio (assolutamente scolastico) di codice PHP che una volta eseguito produrrebbe l’errore "cannot modify header information – headers already sent by":
<?php
echo "Sto inviando un output!";
header("Location: https://www.mrw.it");
?>
In questo esempio, la funzione echo
invia un output al browser prima dell’invocazione della funzione header()
con la quale lo sviluppatore sta provando a fare un redirect attraverso la specifica del valore di "Location". Per risolvere questo errore, è sufficiente spostare la funzione header prima della funzione echo
, come segue:
<?php
header("Location: https://www.mrw.it");
echo "Sto inviando un output!";
?>
E’ appena il caso di segnalare che il codice qui sopra, pur non producendo l’errore, non ha un gran senso: la funzione echo
, infatti, non produrrà alcun output visibile per l’utente in quanto la sua location sarà già stata modificata dalla riga di codice che precede.
Come è possibile identificare l’origine dell’errore cannot modify header information – headers already sent
L’esempio visto sopra è puramente scolastico: la maggior parte delle volte che uno sviluppatore incorre nell’errore cannot modify header information – headers already sent non è così semplice capirne la causa.
Per risolvere questo errore, sarà necessario rivedere il codice sorgente per individuare e correggere la fonte dell’output inviato prima delle intestazioni.
Ecco alcuni passaggi utili per risolvere questo problema:
- Verificare la presenza di eventuale output non intenzionale: Verificare se vi sono spazi vuoti o caratteri "invisibili" prima dell’apertura della dichiarazione PHP <?php o dopo la chiusura ?>. Questi spazi o caratteri possono causare un output non intenzionale prima delle intestazioni: se sono presenti vanno rimossi.
- Verificare le impostazioni di codifica: Verificare che il file sorgente sia salvato con la codifica UTF-8 senza BOM (byte order mark). Se il file sorgente dello script PHP è codificato in UTF-8 con BOM, può essere inviato un carattere non visibile al browser prima delle intestazioni HTTP, causando l’errore (per modificare il tipo di codifica si può utilizzare un qualsiasi editor di testo).
- Verificare le chiamate a funzioni che producono output: Verificare se ci sono chiamate a funzioni che inviano output, come
echo
,print
,printf
ovar_dump
, prima delle intestazioni.
Utilizzare l’output buffering
Utilizzare la funzione ob_start()
di PHP può essere d’aiuto per evitare di incorrere nell’errore cannot modify header information – headers already sent: questa funzione posizionata prima dell’inizio del codice attiva la raccolta dell’output in un buffer. Sarà quindi sufficiente utilizzare la funzione ob_end_flush()
alla fine del codice per inviare l’output al browser.