Come appare il messaggio
PHP Warning: Cannot modify header information - headers already sent by (output started at /var/www/example.com/config.php:1) in /var/www/example.com/login.php on line 12Cause frequenti
- Un BOM UTF-8 (byte nascosti) all'inizio di un file PHP, spesso salvato da un editor, di solito in
config.phpo in un template. - Spazi o una riga vuota prima di
<?phpo dopo un?>di chiusura in un file incluso. echo,printo HTML prima diheader(),setcookie()osession_start().- Un warning o notice PHP stampato nella pagina prima della chiamata a header (
display_errorsattivo), che causa poi questo secondo errore. - Un plugin o tema di un CMS che stampa output troppo presto.
Verifica
- Trova il file indicato nel messaggio e controlla i primi byte per un BOM
head -c 3 /var/www/example.com/config.php | xxd - Cerca un BOM nei file PHP
grep -rl $'\xEF\xBB\xBF' --include='*.php' /var/www/example.com | head - C'è output dopo un tag di chiusura a fine file?
tail -c 30 /var/www/example.com/config.php | xxd - Controlla il file per errori di sintassi
php -l /var/www/example.com/config.php
Soluzione
- Apri il file indicato dal messaggio e rimuovi tutto ciò che precede
<?php, BOM incluso (salva come UTF-8 senza BOM). - Nei file che contengono solo PHP ometti il
?>finale, così non viene inviato un a capo in coda. - Sposta
header(),setcookie()esession_start()prima di qualsiasi output oppure riorganizza in modo che l'output venga per ultimo. - Se un warning precedente è il primo output, correggilo oppure imposta
display_errors = Offin produzione e usa i log. - Solo come tampone,
ob_start();all'inizio mette in buffer l'output, ma correggi la causa vera.
Domande frequenti
Cosa significa output started at config.php:1?
Il primo byte è stato inviato dalla riga 1 di quel file. Indica un BOM o spazi prima del tag di apertura.
Posso ignorare l'avviso?
No. Il redirect, il cookie o la sessione che dovevano essere impostati vanno persi e login e redirect possono fallire in silenzio.