Function.header
Aus PHP-Wiki
header — Sendet einen HTTP-Header in Rohform
Inhaltsverzeichnis |
Beschreibung
void header ( string $string [, bool $replace [, int $http_response_code ]] )
header() wird zum Senden von
HTTP-Anfangsinformationen (Headern) im Rohformat
benutzt. Weitere Informationen über die HTTP Header
finden Sie in der [HTTP/1.1 Spezifikation].
Beachten Sie, dass Sie die Funktion header() aufrufen müssen,
bevor Sie irgendeine andere Art von Ausgabe (seien es normale HTML-Tags,
Leerzeilen in einer Datei oder von PHP) zum Client schicken. Es handelt sich
hier um einen typischen Fehler, der zum Beispiel auftritt, wenn Sie Code
mittels include() oder require() oder
einer anderen Dateizugriffs-Funktion einlesen, die Leerzeichen oder
Leerzeilen enthalten, die ausgegeben werden, bevor header()
aufgerufen wird. Das gleiche Problem kann auch auftreten, wenn Sie eine
Datei verwenden, in der HTML und PHP vermischt wurden.
<html>
<?php
/* Dies wird einen Fehler provozieren. Beachten Sie die vorangehende Ausgabe,
* die vor dem Aufruf von header() erzeugt wird */
header('Location: http://www.example.com/');
?>
Parameter-Liste
- string
- Der Header-String. 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");
?> 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/"); /* Browser umleiten */
/* Stellen Sie sicher, dass der nachfolgende Code nicht ausgefuehrt wird, wenn
eine Umleitung stattfindet. */
exit;
?>
- replace
- Der optionale Parameter replace gibt an, ob der Header einen vorhergehenden gleichartigen Header ersetzten soll, oder ob ein zweiter Header des selben Typs hinzugefügt werden soll. Standardmäßig wird ersetzt; wenn Sie als zweites Argument FALSE übergeben, können Sie so mehrere Header desselben Typs erzwingen. Zum Beispiel: <?php
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);
?>
- http_response_code
- Forciert einen HTTP-Response-Code des angegebenen Wertes.
Rückgabewerte
Es wird kein Wert zurückgegeben.
ChangeLog
Version
Beschreibung
4.4.2 and 5.1.2
Die Funktion unterbindet das gleichzeitige Versenden mehrerer Header
zum Schutz gegen Header-Injection-Angriffe.
4.3.0
Der Parameter http_response_code
wurde hinzugefügt.
4.0.4
Der Parameter replace
wurde hinzugefügt.
Beispiele
#1 Download
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("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Datum in der Vergangenheit ?>
Hinweis: 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 ihren Browser einstellen können, um das standardmäßige Caching-Verhalten zu verändern. Durch das Senden obiger Header sollten Sie jedwede Einstellungen, die die Ausgabe Ihres Skriptes zwischenspeichern würden, außer Kraft setzen. Weiterhin 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.
Anmerkungen
Hinweis:
Seit 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 setzen Sie die
Konfigurationsdirektive output_buffering in der
php.ini bzw. in den Server-Konfigurationsdateien auf On.
Hinweis:
Die HTTP-Status-Headerzeile 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, sofern die
HTTP-Header noch nicht gesendet wurden.
Hinweis:
Der Microsoft Internet Explorer 4.01 hat einen Bug, der diese
Funktionalität verhindert, und es gibt keinen Workaround. Auch
im Microsoft Internet Explorer 5.5 existiert ein Bug, der dies
behindert, dieser kann jedoch mittels eines Upgrades auf Service
Pack 2 oder höher behoben werden.
Hinweis:
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.
Hinweis:
HTTP/1.1 verlangt einen absoluten URI inklusive 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
/* Redirect auf eine andere Seite im aktuell angeforderten Verzeichnis */
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>
Hinweis:
Die Session-ID wird nicht mit dem Location-Header übermittelt, außer Sie
haben session.use_trans_sid
eingeschaltet. Sie muss daher manuell durch Verwendung der
SID-Konstante hinzugefügt werden.
Siehe auch
headers_sent() setcookie() The section on HTTP authentication