back to top

Cannot modify header information – headers already sent: come risolvere l’errore PHP

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:

  1. 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.
  2. 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).
  3. Verificare le chiamate a funzioni che producono output: Verificare se ci sono chiamate a funzioni che inviano output, come echo, print, printf o var_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.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Correggere l’errore the uploaded file exceeds the upload_max_filesize directive in php.ini

L'errore the uploaded file exceeds the upload_max_filesize directive in...

Ricavare l’estensione di un file con PHP

Quando si lavora con i file in un'applicazione web,...

GD Library: creazione, manipolazione e ridimensionamento immagini con PHP

Le librerie GD (o GD Library), sono componenti fondamentali...

PHP: impostare il fuso orario italiano

Le tue pagine PHP non mostrano l’orario corretto? Probabilmente...

5 script PHP per gestire BBCode

A volte può aversi l'esigenza di dover offrire agli...

Estrarre hostname e dominio da una URL con PHP

Grazie alla funzione parse_url() di PHP รจ possibile analizzare...
Pubblicitร