Fehler: Warning: Cannot modify header information

#1
Hallo,

ich bekomme wenn ich meine Website auf den Server stelle diese Fehlermeldung.beim Aufruf:

"Warning: Cannot modify header information - headers already sent by (output started at /usr/www/users/web/TEST.php:1) in /usr/www/users/web/TEST.php on line 4"

PHP:
<?php 
error_reporting(E_ALL);
ini_set('display_errors',true);
header('Location:login.php');
?>
Das ist der komplette Code in der Datei. Ich bekomme den gleichen Fehler in der Original-Seite und habe bis auf diese paar Zeilen alles rausgeschmissen. Was verursacht den Fehler und wie kann ich ihn beheben?

Lokal im XAMPP funktioniert alles.

Besten Dank im Voraus.

VG
Umbriell
 

SpiceLab

ZENmechanic
Premium-User
#2
Was verursacht den Fehler und wie kann ich ihn beheben?
Vor header() darf keinerlei Form einer Ausgabe erfolgen. Hierzu zählt auch ein Leerzeichen oder Zeilenumbruch zu Beginn des Codes (vor <?php).

Der Klassiker eben. Und Google kennt ihn auch, wenn der Wortlaut der Fehlermeldung (oder Thementitel) genannt wird.
  1. http://de2.php.net/manual/de/function.header.php
  2. http://www.vlmedia.de/304/haufiger-php-error-cannot-modify-header-information-headers-already-sent
  3. https://www.arclab.com/en/kb/php/ph...-header-information-headers-already-sent.html
  4. ...
[edit]Tipp-Ex[/edit]
 
Zuletzt bearbeitet:
#3
Hi,
danke für die Antwort.

Aber auch nach dem Entfernen aller möglichen Ausgaben wird nicht weitergeleitet.
Ich habe jetzt mal dies getestet und bekomme eine leere Seite angezeigt:

PHP:
<?php
header('Location:http://www.google.com');
?>
Ich versteh nicht, wieso das im web nicht funktioniert bei mir lokal aber doch.
Hast Du eine Erklärung für mich?

VG
Umbriell
 

SpiceLab

ZENmechanic
Premium-User
#4
Ich habe jetzt mal dies getestet und bekomme eine leere Seite angezeigt:

PHP:
<?php
header('Location:http://www.google.com');
?>
Ich versteh nicht, wieso das im web nicht funktioniert bei mir lokal aber doch.
Hast Du eine Erklärung für mich?
Der Code funktioniert bei mir erwartungsgemäß auf beiden Servern (lokal & online).

Bewegst Du Dich im Netz auf einem HTTPS-Server?

Dann versuch es von dort aus mal ohne den Protokoll-Präfix http: im URL:
PHP:
<?php
header('Location: //www.google.com');
?>
 
#5
Ist ken HTTPS. Die Datei ist UTF8 ohne BOM kodiert.
Ich suche jetzt schon die ganze Zeit nach einer Einstellung in der Serverkonfiguration, die das ganze unterbinden könnte.
Da finde ich aber auch nichts und ich wüßte auch nicht, warum die Möglichkeit geblockt werden sollte.

Fällt Dir noch was ein?

VG
Umbriell
 

SpiceLab

ZENmechanic
Premium-User
#7
In meinem Serverlog taucht die erfolgreiche Weiterleitung (HTTP-Status 302) auf:
Code:
*IP anonymisiert* - - [30/Dec/2016:22:44:52 +0100] "GET /headerlocation.php HTTP/1.0" 302 208 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
 
#8
Was passiert denn wenn Du folgendes versuchst :)

PHP:
<?php
ob_start();
header('LOCATION: http://www.google.de');
ob_end_flush();
?>
oder:
PHP:
<?php
ob_start();
@header('LOCATION: http://www.google.de');
ob_end_flush();
?>
Theoretisch sollte das klappen :)

Ich verwende die erste Funktion und diese klappt bei Mir :)
 
#9
Bei beiden wird wieder die leere Seite angezeigt. Die Anzeige in der Adresszeile des Browsers bleibt unverändert.

Ich tappe komplett im Dunkeln. Hat noch jemand eine Idee woran es liegen kann?

VG
Umbriell
 

SpiceLab

ZENmechanic
Premium-User
#10
Was passiert denn wenn Du folgendes versuchst :)

PHP:
<?php
ob_start();
header('LOCATION: http://www.google.de');
ob_end_flush();
?>
oder:
PHP:
<?php
ob_start();
@header('LOCATION: http://www.google.de');
ob_end_flush();
?>
Theoretisch sollte das klappen :)

Ich verwende die erste Funktion und diese klappt bei Mir :)
Ich gehe davon aus, dass sich @Umbriell mit meinen eingangs empfohlenen Links gestern auseinandergesetzt, und die diversen Lösungsvarianten durchgespielt hat.

Deine Empfehlung mit ob_***() ist dort nämlich auch auf der Liste :
Code
PHP:
<?php
ob_start();
echo "Umleitung...";
header("Location: index.php");
ob_flush();
ob_end_clean();
?>
ob_***-Funktionen kontrollieren den Output-Buffer und können die Ausgaben aufschieben.
Zitat-Quelle: http://www.vlmedia.de/304/haufiger-...der-information-headers-already-sent#behebung

Ich tappe komplett im Dunkeln. Hat noch jemand eine Idee woran es liegen kann?
Gäbe es nicht besagte PHP-Fehlermeldung, könnte man ja fast annehmen, dass auf dem Server kein PHP läuft :confused:

Hast Du mal die Server-/Error-Logs vom gestrigen Abend studiert, was darin bei Deinen einzelnen Aktionen festgehalten wurde?

Siehe mein gestriger letzter Post:
In meinem Serverlog taucht die erfolgreiche Weiterleitung (HTTP-Status 302) auf:
Code:
*IP anonymisiert* - - [30/Dec/2016:22:44:52 +0100] "GET /headerlocation.php HTTP/1.0" 302 208 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
 

SpiceLab

ZENmechanic
Premium-User
#11
Ich suche jetzt schon die ganze Zeit nach einer Einstellung in der Serverkonfiguration, die das ganze unterbinden könnte.
Da finde ich aber auch nichts [...]
Bitte überprüfen, ob Du auch tatsächlich alles berücksichtigt hast: http://php.net/manual/de/configuration.php

Wenn dem so sein sollte, kann mit phpinfo() auf beiden Servern ein Vergleich der Server-/PHP-Konfigurationen durchgeführt werden, um mutmaßliche Unterschiede zu entdecken, die einen Hinweis auf die Fehlerursache geben könn(t)en.
PHP:
<?php
phpinfo();
?>
http://php.net/manual/de/function.phpinfo.php

Beachte hierbei auch die Möglichkeit, die Ausgabe durch Parameter gezielt zu filtern, damit die ellenlange Liste einen nicht erschlägt :cool:

http://php.net/manual/de/function.phpinfo.php#refsect1-function.phpinfo-parameters

[edit]Tipp-Ex[/edit]
 
Zuletzt bearbeitet:
#12
Hi,

Lokal habe ich die Version 7.0.13
Online ist die Version 7.0.14

Lokal ist eine Tabelle "HTTP Headers Information" vorhanden. Diese fehlt in der online PHP-Info.

Ich gehe davon aus, dass die unterschiedlichen Versionen hier nicht ausschlaggebend sind, ob das Fehlen der Tabelle der springende Punkt ist weiß ich leider nicht.
Kann das sein und wenn ja, wie kann ich diesen Punkt dann in der Konfiguration aktivieren?

http://php.net/manual/de/configuration.php geh ich gerade durch.

VG
Umbrielle
 

SpiceLab

ZENmechanic
Premium-User
#13
Lokal ist eine Tabelle "HTTP Headers Information" vorhanden. Diese fehlt in der online PHP-Info.

[...] ob das Fehlen der Tabelle der springende Punkt ist weiß ich leider nicht.
Sowas ist mir auch noch nicht untergekommen, aber man lernt ja bekanntlich nie aus, und so kann es durchaus möglich sein, dass das der Grund ist.

https://de.wikipedia.org/wiki/Liste_der_HTTP-Headerfelder#Antwort-Headerfelder
http://httpd.apache.org/docs/current/mod/mod_headers.html
 
#14
Hi,

das Problem ist behoben. Die Dateien waren doch mit BOM kodiert. Keine Ahnung warum die Anzeige im Editor nicht passte.

Ich habe diesen Code einmal in dem Verzeichnis aufgerufen und wider erwarten wurden sämtliche Dateien umkodiert:

PHP:
<?php
// Tell me the root folder path.
// You can also try this one
// $HOME = $_SERVER["DOCUMENT_ROOT"];
// Or this
// dirname(__FILE__)
$HOME = dirname(__FILE__);

// Is this a Windows host ? If it is, change this line to $WIN = 1;
$WIN = 0;

// That's all I need
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>UTF8 BOM FINDER and REMOVER</title>
<style>
body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
.FOUND { color: #F30; font-size: 14px; font-weight: bold; }
</style>
</head>
<body>
<?php
$BOMBED = array();
RecursiveFolder($HOME);
echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
echo '</p>';

// Recursive finder
function RecursiveFolder($sHOME) {
  global $BOMBED, $WIN;

  $win32 = ($WIN == 1) ? "\\" : "/";

  $folder = dir($sHOME);

  $foundfolders = array();
  while ($file = $folder->read()) {
   if($file != "." and $file != "..") {
     if(filetype($sHOME . $win32 . $file) == "dir"){
       $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
     } else {
       $content = file_get_contents($sHOME . $win32 . $file);
       $BOM = SearchBOM($content);
       if ($BOM) {
         $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;

         // Remove first three chars from the file
         $content = substr($content,3);
         // Write to file
         file_put_contents($sHOME . $win32 . $file, $content);
       }
     }
   }
  }
  $folder->close();

  if(count($foundfolders) > 0) {
   foreach ($foundfolders as $folder) {
     RecursiveFolder($folder, $win32);
   }
  }
}

// Searching for BOM in files
function SearchBOM($string) {
   if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
   return false;
}
?>
</body>
</html>
Besten Dank für die Beiträge.

VG
Umbriell
 

SpiceLab

ZENmechanic
Premium-User
#15
Ist ken HTTPS. Die Datei ist UTF8 ohne BOM kodiert.
das Problem ist behoben. Die Dateien waren doch mit BOM kodiert.
Als hätte ich es nicht geahnt, nach den Live-Tests auf meinen Servern (lokal + online), die ein Leerzeichen oder Zeilenumbruch als Ursache defintiv ausgeschlossen hatten, weil ich Deinen gezeigten Code selbstverständlich per "Copy&Paste" übernommen habe, um letzte Gewissheit zu haben :-]
Keine Ahnung warum die Anzeige im Editor nicht passte.
Ich auch nicht.

Woher auch, wenn ich noch nicht mal eine Ahnung davon habe, mit welchem Editor Du arbeitest :D
 
#16
Hi Spicelab,
als Editor benutze ich notepadd++. Damit arbeite ich eigentlich sehr gerne und bisher hat er mich auch noch nicht enttäuscht.
Evtl. ist auch beim Upload irgendwas passiert, da es bei mir lokal ja lief. Was auch immer der Grund war, jetzt funktioniert es.
Nur ärgerlich um die Zeit, die da jetzt unnötigerweise drin steckt.

Nochmal besten Dank für Deine Hilfe!

VG
Umbriell