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