PHP Handbuch
Zurück |  | Nach vorne

# header

(PHP 3, PHP 4 )

header -- Sendet einen HTTP-Header

## Beschreibung

int header ( string string [, bool replace [, int http_reponse_code]])

header() wird zum Senden von HTTP Anfangsinformationen (Headern) benutzt. Weitere Informationen über HTTP Header finden Sie unter HTTP/1.1 specification.

Der optionale Parameter `replace` gibt an, ob der Header einen vorhergehenden Header ersetzten soll, oder ob ein zweiter Header des selben Typs hinzugefügt werden soll. Standardmäßig wird ersetzt. Sie können jedoch als das zweite Argument `FALSE` übergeben, und so mehrere Header desselben Typs erzwingen. Zum Beispiel:

    <?php
    header('WWW-Authenticate: Negotiate');
    header('WWW-Authenticate: NTLM', FALSE);
    ?>

Der zweite optionale Parameter `http_response_code` spezifiziert den HTTP Response Code. (Dieser Parameter ist in PHP 4.3.0 und höher verfügbar.)

Es gibt zwei Spezialfälle von Header-Aufrufen. Der erste ist ein Header, der mit "`HTTP/`" beginnt (ob groß- oder Kleinschreibung ist nicht relevant) und zum Herausfinden des zu sendenden HTTP Statuscodes verwendet wird. Wenn Sie zum Beispiel Apache konfiguriert haben, um ein PHP Skript zum Bearbeiten von Anforderungen fehlender Dateien (mittels der `ErrorDocument` Direktive) zu verwenden, möchten Sie bestimmt sicherstellen, dass Ihr Skript den passenden Statuscode generiert.

    <?php
      header("HTTP/1.0 404 Not Found");
    ?>

> Anmerkung: Die HTTP Status Header Zeile wird immer die erste zum Client gesendete sein, egal ob der aktuelle header() - Aufruf der erste ist oder nicht. Der Status kann mittels header() jederzeit mit einer neuen Statuszeile überschrieben werden, es sei denn, dass die HTTP Header bereits gesendet wurden.

> Anmerkung: In PHP 3 funktioniert dies nur, wenn PHP als Apache Modul kompiliert wurde. Sie können den gleichen Effekt erzielen, wenn Sie den `Status` Header verwenden.

>     <?php
>     header("Status: 404 Not Found");
>     ?>

Der zweite Spezialfall ist der "Location:" Header. Es wird nicht nur der Header an den Browser geschickt, sondern auch ein `REDIRECT` (302) Statuscode, wenn nicht bereits ein `3xx` Statuscode gesendet wurde.

    <?php
    header("Location: http://www.example.com/"); // Umleitung des Browsers
    exit;                                        // Sicherstellen, dass nicht trotz Umleitung
                                                 // der nachfolgende Code ausgeführt wird.
    ?>

> Anmerkung: HTTP/1.1 verlangt einen absoluten URI inkl. dem Schema, Hostnamen und absoluten Pfad als Argument von Location:, aber manche Clients akzeptieren auch relative URIs. Gewöhnlich können Sie mittels `$_SERVER['HTTP_HOST']`, `$_SERVER['PHP_SELF']` und dirname() aus einem relativen Link einen absoluten URI selbst erstellen:

>     <?php
>     header("Location: http://".$_SERVER['HTTP_HOST']
>                           .dirname($_SERVER['PHP_SELF'])
>                           ."/".$relative_url);
>     ?>

PHP-Skripte erzeugen oft dynamische Inhalte, die weder vom Browser noch von irgendeinem Proxy zwischen Web-Server und Client-Browser gepuffert ("gecached") werden sollen bzw. dürfen. Bei vielen Proxies und Browsern kann das Cachen wie folgt unterbunden werden:

    <?php
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Datum aus Vergangenheit
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
                                                         // immer geändert
    header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");                          // HTTP/1.0
    ?>

> Anmerkung: Es könnte auch sein, dass Ihre Seiten nicht zwischengespeichert werden, auch wenn Sie obigen Header nicht ausgeben. Es gibt eine Anzahl Optionen, welche die Benutzer in deren Browser einstellen können, um das standardmäßige Verhalten bezüglich des Caching zu verändern. Durch das Senden obiger Header sollten Sie irgendwelche Einstellungen, welche die Ausgabe Ihres Skriptes zwischenspeichern würden, außer Kraft setzen.

> Weiters können Sie session_cache_limiter() und die Konfigurationsoption `session.cache_limiter` verwenden, um die korrekten Header bezüglich Caching automatisch generieren zu lassen, sollten Sie Sessions benutzen.

Beachten Sie, dass header() aufgerufen werden muss, bevor eine Ausgabe gesendet wurde, egal ob normale HTML Tags, leere Zeilen in einer Datei oder von PHP. Ein weit verbreiteter Fehler ist mittels include(), require(), oder anderen Dateizugriffsmethoden Code zu lesen, und so unbewusst Leerzeichen oder Leerzeilen auszugeben, bevor header() aufgerufen wird. Das gleiche Problem besteht auch bei Verwendung einer einzigen PHP/HTML Datei.

    <?php header ("Content-type: audio/x-pn-realaudio"); ?>
    // Funktioniert nicht, beachten Sie die obige Leerzeile

> Anmerkung: In PHP 4 können Sie dieses Problem umgehen, indem Sie Output Buffering benutzen (mit dem Overhead, dass alle Ihre Ausgaben an den Browser gepuffert werden, bis Sie diese Senden). Um dies zu tun, verwenden Sie in Ihrem Skript ob_start() und ob_end_flush(), oder setzten die Konfigurationsdirektive `output_buffering` in der `php.ini` bzw. in den Server Konfigurationsdateien.

Wollen Sie den Benutzer auffordern, die von Ihnen gesendeten Daten wie z.B. eine generierte PDF Datei zu speichern, können Sie den Header Content-Disposition verwenden, um einen empfohlenen Dateinamen anzubieten und den Browser zu zwingen, den Dialog zum Speichern anzuzeigen.

    <?php
    // Wir werden eine PDF Datei ausgeben
    header("Content-type: application/pdf");

    // Es wird downloaded.pdf benannt
    header("Content-Disposition: attachment; filename=downloaded.pdf");

    // Die originale PDF Datei heißt original.pdf
    readfile('original.pdf');
    ?>

> Anmerkung: Der Microsoft Internet Explorer 4.01 hat einen Bug, der diese Funktionalität verhindert, und es gibt keinen Workaround. Auch in Microsoft Internet Explorer 5.5 existiert ein Bug, der dies behindert, dieser kann jedoch mittels einem Upgrade auf Service Pack 2 oder neuer behoben werden.

> Anmerkung: Ist safe mode aktiviert, wird die UID des Skriptes dem `realm` Teil des Headers `WWW-Authenticate` (für HTTP Authentifizierung verwendet) hinzugefügt, sollten Sie diesen Header setzen.

Siehe auch headers_sent(), setcookie() und den Teil HTTP Authentifizierung.

Zurück | Zum Anfang | Nach vorne
HTTP-Funktionen | Nach oben | headers_sent