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");
?>
Letzte Posts aus unserem Forum

Wer kennt .....

Hallo erstmal wer kennt von euch einen WEbprogrammieren,desginer der mir eine Seite erstellen kann ,Communityportal sowas in der art wie ... » mehr

von NCWebmaster am Mittwoch, 7. Oktober 2009 00:32 in PHP - bisher 2 Antworten
Letzter Beitrag: Montag, 17. Dezember 2012 16:57 von maharadja

...einen guten Onlineshop für Taufringe? Ich habe bisher Taufringe Direkt gefunden und wollte mal nachhaken, ob der Shop für Taufringe wirklich so ... » mehr

Webentwickler Konferenz in Hamburg

Hallo Zusammen, Am 20./21. Mai findet in Hamburg die erste Developer Conference 2011 statt. Wie der Name bereits verrät, handelt die Konferenz rund ... » mehr

von devcon-hamburg am Dienstag, 12. April 2011 16:50 in PHP - noch nicht beantwortet

bedingte Weiterleitung in Kontaktformularen

Hallo zusammen, ich habe ein kleines Problem: Ich brauche bei der Entwicklung eines Kontaktformulares für eine Website eine bedingte Weiterleitung ... » mehr

von scatha am Donnerstag, 10. März 2011 01:12 in PHP - noch nicht beantwortet

Gesucht: Auslesen einer externen Website

Mein vorhaben ist recht simpel aber ich bin php noob (hoffe das entschuldigt es nen bissl xD) und hab kp wie ichs anfangen soll. Und zwar möchte ich ... » mehr

von HeathenMan am Dienstag, 1. Februar 2011 22:57 in PHP - bisher 1 Antwort
Letzter Beitrag: Donnerstag, 3. Februar 2011 14:43 von alm

Hallo, am einfachsten und kompaktesten kann man das mit einem regulären Ausdruck machen. Einfach mal nach der Funktion preg_match_all suchen und den ... » mehr

Zeilenumbruch in der Bildergalerie-Beschriftung

Hallo, die Bildergalerie mit php und js ist super, jedoch möchte ich gern zu meinen Bildern verschiedene Bemerkungen machen und zwar untereinander, ... » mehr

von Sylma am Mittwoch, 26. Januar 2011 01:13 in PHP - bisher 1 Antwort
Letzter Beitrag: Freitag, 28. Januar 2011 10:16 von alm

Hallo, ich nehme an, dass \n im Beschreibungstext nicht funktioniert aber versuchen kann man es. Ansonsten: Schon mal mit einer UTF-Sequenz ... » mehr

¬ Tutorials



¬ Insolvenzrecht