Problem mit HTTP-Antwortheadern in PHP
Nach den HTTP-Regeln werden zuerst
die HTTP-Header gesendet und dann der HTTP-Antwortkörper.
Deshalb hat die Arbeit mit der Funktion header
in PHP ihre Besonderheiten.
Die Sache ist die, dass wenn vor dem Aufruf dieser
Funktion eine Ausgabe auf den Bildschirm erfolgt,
diese als Beginn des Antwortkörpers interpretiert wird. In diesem Fall führt der Aufruf
der Funktion header
zu einer PHP-Warnung mit dem Text
headers already sent.
Dabei können die Header sogar gesendet werden.
Es kann sogar sein, dass der Fehler nicht ausgegeben wird (hängt von den
PHP-Einstellungen ab). Aber meistens wird das nur
lokal passieren, und wenn die Website im Internet veröffentlicht wird,
bricht alles zusammen.
Unter Ausgabe auf den Bildschirm wird jeder Text verstanden. Zum Beispiel so:
text
<?php
header('Content-Type: text/html');
?>
Oder eine leere Zeile:
<?php
header('Content-Type: text/html');
?>
Oder ein Leerzeichen:
<?php
header('Content-Type: text/html');
?>
Oder ein Tag:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Oder Ausgabe via echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Oder Ausgabe via var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Sogar PHP-Warnungen sind Ausgaben auf den Bildschirm. Im folgenden Beispiel wird absichtlich auf eine nicht existierende Variable zugegriffen, was zur Ausgabe einer Warnung führt:
<?php
$text += 1;
header('Content-Type: text/html');
?>
Aufgetrennte PHP-Klammern erzeugen ebenfalls Ausgabe auf den Bildschirm:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Erzeugen Sie absichtlich eine Ausgabe auf den Bildschirm
vor der Funktion header.
Studieren Sie den Text des auftretenden Fehlers.
Korrigieren Sie den Fehler, der in diesem Code gemacht wurde:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>