PHP Header – HTTP-Header in PHP verschicken

Die PHP Funktion Header sendet einen HTTP Response Header an den Client, der zuvor eine URL aufgerufen hat. Der Server liefert im Header eine Rückmeldung, die Auskunft über die Beantwortung einer Anfrage (HTTP-Request) gibt. Auf diese Weise kann der Client (der Browser eines Seitenbesuchers oder etwa ein Bot-Programm) beispielsweise über den Inhalt der vom Server gelieferten Rückmeldung auf die Anfrage informiert werden.

Angegeben werden in einem HTTP-Header Informationen, wie der Typ der vom Server gelieferten Daten (content-type) sowie der Zeichensatz, in dem die gesendete Datei kodiert ist (z.B. ISO-8859-1, ISO-8859-15, UTF-8...). Darüber hinaus gibt der Webserver im Header an, ob die gesendete Datei gepackt ist, damit das File auf Seite des Clients – entsprechend dem angegebenen Format – wiederum entpackt wird und erst dann zur Darstellung kommt (immer vorausgesetzt, dass der Client gepackte Daten akzeptiert, was er in seiner Anfrage mittels Request-Header angibt).

Neben diesen inhaltsspezifischen Headern meldet der Webserver den Status einer Abfrage (HTTP-Status Header) aber auch Informationen bzgl. des Cachings der Anfragen, die den Browser bei erneuten Zugriffen auf eine URL dazu veranlassen kann die Daten in einem gewissen zeitlichen Rahmen aus dem Browsercache zu entnehmen statt eine erneute Anfrage an den Webserver zu senden.

Fehlermeldung bei PHP Headers: Cannot Modify Header

Beim Senden von HTTP-Headers mit PHP kommt es manchmal zu Fehlern, die sich durch eine Fehlermeldung der Form „Warning: Cannot modify header information - headers already sent by (output started at ...” äußern. Ursache dieses Fehlers ist die vorzeitige Ausgabe des Contents oder aber Teilen davon – bedeutet, dass irgendwo in einem Script Zeichen ausgegeben wurden, danach aber noch versucht wurde Header per PHP zu verschicken. Alle benötigten HTTP-Header müssen grundsätzlich vor dem zu versendenden Inhalt an den Client verschickt worden sein. Der Response-Header muss vor dem Content beim Client angekommen sein, damit dieser weiss, wie er die empfangenen Daten verarbeiten soll. Nach der Ausgabe des ersten Zeichens durch ein Script werden keine weiteren Header mehr angenommen, wobei der Server derartige Versuche mit der entsprechenden Meldung quittiert.

Der Fehler tritt häufig auf, wenn eine per Include eingebundene Datei – egal ob gewollt oder ungewollt – eine Ausgabe generiert. Bei allen eingebundenen PHP-Dateien sollte daher darauf geachtet werden, dass vor dem Öffnenden- sowie nach dem Schließenden PHP-Tag (<?php und ?>) keinerlei Leerzeichen oder Zeilenumbrüche mehr enthalten sind. Nachfolgend sollen einige Beispiele zu den wichtigsten HTTP Response Headers die Verwendung der Header-Funktion anhand einiger praktischer Beispiele demonstrieren.

PHP Header: Location

Mit dem Location-Header kann der anfragende Client auf eine andere URL verwiesen werden. Hier wird lediglich der Header an den Client verschickt – es wird kein Content an den anfragenden Browser geschickt. Ob dieser die angegebene Adresse abruft oder nicht liegt allein in der Verantwortung des Clients. Für den Webserver ist die Verarbeitung mit dem Senden des Headers erledigt. Beachten Sie zum Location-Header auch unsere Beispiele unter Redirect in PHP.

<?php
    // Redirect auf eine neue Domain (gleicher Pfad und gleiches File)
    header ("Location: http://www.neue_domain.de" . $_SERVER['PHP_SELF']);
    // Dokument ist permanent unter der neuen Adresse erreichbar
    // (ansonsten würde der Location-Header den Status-Code 302 liefern)
    header ("HTTP/1.0 301 Moved Permanently");
?>

PHP Header: Status

Der Status-Header gibt dem Browser oder allgemeiner dem Client eine Rückmeldung darauf, mit welchem Status ein HTTP-Request beantwortet wird. Folgender Script-Code zeigt die Aufrufe der wichtigsten Statusmeldungen, mit denen ein PHP-Script antworten kann. Als Status wird der Header erkannt, wenn die angegebene Zeichenkette mit HTTP/ (egal ob gross- oder klein geschrieben) beginnt.

<?php
    // Angefordertes Dokument wurde dauerhaft verlegt (häufig in Verbindung mit einem Redirect)
    header ("HTTP/1.0 301 Moved Permanently");
    // Wie letzter Status allerdings mit dem Unterschied, dass das File nur kurzzeitig verlegt wurde.
    header ("HTTP/1.0 302 Moved Temporarily");
    // Datei wurde seit dem letzten Zugriff nicht verändert
    // In diesem Fall wird die Datei nicht verschickt und damit die Menge der zu verschickenden
    // Daten reduziert.
    header ("HTTP/1.0 304 Not Modified");

    // Zum Zugriff auf die Datei wird eine Autorisierung verlangt
    header ("HTTP/1.0 401 Unauthorized");
    // Zugriff auf ein Dokument ist verboten
    // Wird auch versendet, wenn das File per .htaccess geschützt ist.
    header ("HTTP/1.0 403 Forbidden");
    // Datei wurde nicht gefunden
    header ("HTTP/1.0 404 Not Found");
?>

PHP Header: Type (content-type)

Mit dem Type-Header – genauer gesagt wird der Header mit dem String „content-type:” eingeleitet – wird dem Client mitgeteilt, dass das Dokument einen bestimmten Mime-Type und ggf. eine gewisse Kodierung verwendet. Wenn ein bestimmter Zeichensatz festgelegt werden soll – etwa bei Textdateien – dann wird dieser mit dem Zusatz charset angegeben. Nachfolgend einige Mime-Typen und die zugehörigen Header, die den Browser auf das Format der Datei hinweisen. Beachten Sie bitte, dass die per Content-Type angegebene Zeichenkodierung – falls angegeben – auch dann von Browsern verwendet wird, wenn im HEAD-Bereich einer HTML-Datei etwas anderes angegeben wurde.

<?php
    // Das zu versendende File ist ein gepacktes Archiv (gz, tgz oder zip)
    header("content-type: application/x-gzip");
    // Die Datei ist ein Bild und vom Typ gif
    header("content-type: image/gif");
    // Wie bei der letzten Datei allerdings ein jpg-File
    header("content-type: image/jpg");
    // Datei liegt als Textfile genauer gesagt als HTML-Datei vor und verwendet den Zeichensatz ISO-8859-1
    header("content-type: text/html; charset=iso-8859-1");
?>

PHP Header bei XML Files

Beim Erzeugen einer XML-Datei per PHP muss der korrekte, diesem Format entsprechende, Mime-Type in einem Header angegeben werden. Wird dies versäumt, so kann es sein, dass der Browser das Dokument nicht richtig verarbeitet. Erstellt ein PHP-Script beispielsweise einen RSS-Feed oder auch einen im XML-Format formulierten Ajax-Response, so ist das im Header angegebene Dateiformat von größter Bedeutung. Empfängt der Browser die Daten eines Ajax Aufrufs, so sind die XML-Daten nur dann unter der Eigenschaft responseXML des HTTPRequest-Objekts abrufbar, wenn der Mime-Type entsprechend korrekt gesetzt wurde.

<?php
    // Das Dokument ist ein Textdokument und enthält XML-Code.
    // Der Zeichensatz wird auf die in XML-Dateien standardmäßig genutzte UTF-8-Kodierung gesetzt
    header("content-type: text/xml; charset=utf-8");
?>

PHP Header und File Download

Beim Herunterladen von Dateien, die per PHP-Code erzeugt werden, ist es wichtig, dass der Client erfährt, welchen Mime-Type und evtl. welche Kodierung das durch das PHP-Script gelieferte Ergebnis hat. Der HTTP-Header sollte bei File-Downloads aber noch eine zweite Angabe enthalten: Neben dem Mine-Type des Dokuments – im unteren Beispiel ein File vom Typ PDF – sollte hier der Name der Datei angegeben werden. Dies ist besonders dann von Interesse, wenn die gelieferte Datei durch den Benutzer gespeichert werden soll. Wird der Dateiname (angegeben mit dem Header „content-disposition”) nicht im Header angegeben, so gibt der Browser den Namen des PHP-Scripts als Dateinamen vor. Der Benutzer muss diesen Namen dann unnötigerweise auf einen sinnvolleren ändern.

<?php
    // Header mit dem Mime-Type senden
    header ("content-type: application/pdf");
    // Dateiname der Datei per Header an den Client senden
    header ("content-disposition: attachment; filename=bericht2007.pdf");
    // Datei an den Client verschicken (alternativ kann hier durch das PHP-Script ein PDF-File
    // erzeugt werden, welches - etwa mit in einem HTML-Formular eingegebenen Informationen -
    // automatisch zusammengestellt wurde)
    readfile ("/dokumente/bericht2007.pdf");
?>

¬ Tutorials



¬ Insolvenzrecht