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.

Pubblicitร 

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.

Altri contenuti interessanti

Pubblicitร 

Potrebbero interessarti queste guide

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

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

PHP BBCode: script pronti allโ€™uso

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ร