mercoledì 19 ottobre 2011

PHP: Warning: Cannot modify header information - headers already sent

A volte mi è capitato di dover fare un redirect in php tramite la funzione "header", e di avere in rispota l'errore in oggetto.
La causa di questo errore ricorrente (per i principianti come me) è che la funazione Header non accetta nessun tipo di output prima della sua chiamata.

Ad esempio nel seguente codice:

  1. <?php

  2. //riga vuota

  3. header ("Location:redirect.php");

  4. ?>

la riga vuota in php viene inerpretata come un otuput, cosi anche un echo ed un print:


  1. <?php

  2. echo "sono un output";

  3. header ("Location:redirect.php");

  4. ?>

Lo stesso problema può esserre causato da un utilizzo di "include" e/o di un require, se il file indicato per l'operazione contiene un output ed è inserito prima della funzione Header.

Come si risolve?


Possiamo risolvere il problema utilizzando l'output buffering il quale permette di inviare linee (compresi i cookie), anche dopo che si invia il contenuto del corpo, al prezzo del rallentamento della produzione dell’output PHP.
Tale funzione può essere attivata direttamente dal file php.ini , oppure possiamo attuvarlo a run time con la funzione ob_start(); che possiamo inserire all'inizio del nostro script.
Per svuotare il buffer dopo la chiamata all'Header possiamo utilizzare la funzione ob_end_flush(); che ci permette di evitare un overflow del buffer.


  1. <?php

  2. ob_start();

  3. echo "sono un output";

  4. header ("Location:redirect.php");

  5. ob_end_flush();

  6. ?>
Se il problema persiste potrebbe essere dovuto alla presenza del BOM byte order mark, presente nei file formattati in Unicode, per elimarlo usate un editor di testo che vi permetta di salvare il file in formato ANSI.


Spero sia tutto.

Nessun commento:

Posta un commento