So sieht die Meldung aus
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 12Häufige Ursachen
- Ein UTF-8-BOM (versteckte Bytes) am Anfang einer PHP-Datei, oft von einem Editor gespeichert, meist in
config.phpoder einem Template. - Leerraum oder eine Leerzeile vor
<?phpoder nach einem schließenden?>in einer eingebundenen Datei. echo,printoder HTML-Ausgabe vorheader(),setcookie()odersession_start().- Eine PHP-Warnung oder -Notiz wird vor dem Header-Aufruf auf die Seite geschrieben (
display_errorsan) und löst dann diesen zweiten Fehler aus. - Ein Plugin oder Theme in einem CMS, das früh Ausgabe erzeugt.
Prüfen
- Die in der Meldung genannte Datei suchen und ihre ersten Bytes auf ein BOM prüfen
head -c 3 /var/www/example.com/config.php | xxd - PHP-Dateien nach einem BOM durchsuchen
grep -rl $'\xEF\xBB\xBF' --include='*.php' /var/www/example.com | head - Gibt es Ausgabe nach einem schließenden Tag am Dateiende?
tail -c 30 /var/www/example.com/config.php | xxd - Die Datei auf Syntaxprobleme prüfen
php -l /var/www/example.com/config.php
Lösung
- Die in der Meldung genannte Datei öffnen und alles vor
<?phpentfernen, auch das BOM (als UTF-8 ohne BOM speichern). - In Dateien, die nur PHP enthalten, das schließende
?>weglassen, damit kein nachfolgender Zeilenumbruch gesendet wird. header(),setcookie()undsession_start()vor jede Ausgabe verschieben oder so umbauen, dass die Ausgabe zuletzt kommt.- Ist eine frühere Warnung die erste Ausgabe, sie beheben oder in Produktion
display_errors = Offsetzen und stattdessen loggen. - Nur als Notlösung puffert
ob_start();am Anfang die Ausgabe, aber behebe die eigentliche Ursache.
Häufige Fragen
Was heißt output started at config.php:1?
Das erste Byte wurde aus Zeile 1 dieser Datei gesendet. Das deutet auf ein BOM oder Leerraum vor dem öffnenden Tag.
Kann ich die Warnung bedenkenlos ignorieren?
Nein. Die Weiterleitung, das Cookie oder die Session, die hätte gesetzt werden sollen, geht verloren, Logins und Weiterleitungen können still scheitern.