Bahnhofstraße 22, 52134 Herzogenrath Montag - Freitag: 8:00 - 16:30 kontakt@milnersoftware.de 0176 66798849

Aktuelles · PHP · · 4 Min. Lesezeit

„Cannot modify header information – headers already sent“: So finden Sie die Ursache

Login klappt nicht, Weiterleitung geht nicht, und im Protokoll steht „headers already sent“? Die Meldung verrät selbst, wo der Fehler sitzt – wenn man weiß, wo man hinschauen muss.

Zahlenschloss auf einer hellen Computertastatur

Kurz gesagt: Die Meldung bedeutet, dass PHP schon etwas an den Browser geschickt hat, bevor der Code eine Weiterleitung, ein Cookie oder eine Sitzung setzen wollte. Das geht nur in dieser Reihenfolge: erst Header, dann Inhalt. Die Ursache steht in der Meldung selbst hinter „output started at“: Datei und Zeile, an der die erste Ausgabe passiert ist. Meist ist es ein Leerzeichen oder eine Leerzeile vor <?php oder nach ?>, eine unsichtbare BOM am Dateianfang oder eine Warnung, die ausgegeben wurde.

Warning: Cannot modify header information - headers already sent by
(output started at /var/www/html/config.php:24) in /var/www/html/login.php on line 15

Die Folgen: Nach dem Login landet man wieder auf dem Formular, Weiterleitungen funktionieren nicht, der Download einer Datei bricht ab oder in WordPress lässt sich die Seite nach dem Speichern nicht mehr laden.

Die Meldung richtig lesen

Die Meldung nennt zwei Stellen:

  • „output started at config.php:24“ – hier ist das Problem. An dieser Stelle hat PHP bereits Text an den Browser geschickt.
  • „in login.php on line 15“ – hier ist es aufgefallen. Diese Zeile wollte einen Header setzen, zum Beispiel mit header() oder setcookie(). Bei session_start() lautet die Meldung etwas anders („Session cannot be started after headers have already been sent“), die Ursache ist dieselbe.

Fast alle schauen auf die zweite Stelle. Reparieren müssen Sie die erste.

Die häufigsten Ursachen

1. Leerzeichen oder Leerzeilen außerhalb von PHP

Alles, was vor <?php oder nach ?> steht, gibt PHP als Text aus, auch ein Leerzeichen oder eine Leerzeile. Nur einen einzelnen Zeilenumbruch direkt nach ?> verschluckt PHP. Besonders tückisch: eine Leerzeile am Ende von Dateien, die nur PHP enthalten, etwa Konfigurationsdateien oder die functions.php eines WordPress-Themes.

Lösung: In reinen PHP-Dateien das schließende ?> am Ende ganz weglassen. Das ist erlaubt und wird so empfohlen. Am Anfang darf vor <?php nichts stehen.

2. BOM am Dateianfang

Manche Editoren speichern Dateien als „UTF-8 mit BOM“. Die BOM sind drei unsichtbare Bytes ganz am Anfang. Im Editor sieht man nichts, PHP gibt sie aber aus. Zeigt die Meldung auf Zeile 1, ist das der wahrscheinlichste Grund.

Lösung: Datei im Editor als „UTF-8 ohne BOM“ speichern. In Notepad++ heißt das „UTF-8“ statt „UTF-8-BOM“, in VS Code unten rechts über die Kodierung.

3. Ausgaben im Code

Ein echo, print_r() oder var_dump() zum Testen, das stehen geblieben ist, oder HTML, das vor der Logik ausgegeben wird.

4. Warnungen und Hinweise

Ist display_errors eingeschaltet, gibt PHP Warnungen als Text aus, zum Beispiel „Undefined array key“. Diese Ausgabe zählt ebenfalls und blockiert danach jeden Header. Nach einem PHP-Update tauchen deshalb plötzlich „headers already sent“-Meldungen auf, obwohl am Code nichts geändert wurde.

Lösung: die eigentliche Warnung beheben und im Produktivbetrieb display_errors abschalten.

In WordPress

Zeigt „output started at“ auf wp-config.php oder auf die functions.php Ihres Themes, steht dort fast immer ein Leerzeichen oder eine Leerzeile am Anfang oder Ende, oft nach einer Änderung im Theme-Editor. Zeigt die Meldung auf ein Plugin, aktualisieren oder deaktivieren Sie dieses Plugin. Kommen Sie nicht ins Backend, hilft das Umbenennen des Plugin-Ordners per FTP, wie in „Es gab einen kritischen Fehler“ beschrieben.

Warum Output Buffering keine Lösung ist

Oft wird empfohlen, ob_start() an den Anfang zu setzen oder output_buffering in der PHP-Konfiguration einzuschalten. Dann sammelt PHP die Ausgabe zuerst und schickt sie später, und die Meldung verschwindet. Die Ursache bleibt aber: Leerzeilen, Testausgaben oder Warnungen landen weiterhin in Ihrer Seite, etwa mitten in einem JSON-Ergebnis oder vor einer heruntergeladenen PDF-Datei. Als kurzfristige Notlösung geht es, als Reparatur nicht.

Professionelle Hilfe

Bei gewachsenen Anwendungen mit vielen eingebundenen Dateien ist die Stelle nicht immer offensichtlich, vor allem, wenn Warnungen die Ausgabe auslösen. Ich finde die Ursache und behebe sie dauerhaft. Mehr unter PHP-Fehler beheben.

Geschrieben von Przemysław Milner

Weitere Beiträge