(PHP 4, PHP 5, PHP 7, PHP 8)
header — Sendet einen HTTP-Header in Rohform
header() wird zum Senden von HTTP-Anfangsinformationen (Headern) im Rohformat verwendet. 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 mit Leerzeichen oder Leerzeilen, die ausgegeben werden, mittels include oder require oder einer anderen Datei-Zugriffsfunktion einlesen, 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/');
exit;
?>
header
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). Dieser Header wird verwendet, um
den zu sendenden HTTP-Statuscode anzugeben. Wenn Sie zum Beispiel
Apache konfiguriert haben, 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
// Dieses Beispiel veranschaulicht den Spezialfall "HTTP/".
// Bessere Alternativen für typische Anwendungsfälle sind
// 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
// (um http-Statusmeldungen für Clients, die noch HTTP/1.0 verwenden,
// zu überschreiben)
// 2. http_response_code(404); (um die Standardmeldung zu verwenden)
header("HTTP/1.1 404 Not Found");
?>
Der zweite Spezialfall ist der "Location:"-Header. Es wird nicht nur
der Header an den Browser geschickt, sondern auch ein
REDIRECT
-Statuscode (302), wenn nicht bereits der
201
- oder ein 3xx
-Statuscode
gesendet wurde.
<?php
header("Location: http://www.example.com/"); /* Browser umleiten */
/* Stellen Sie sicher, dass der nachfolgende Code nicht ausgeführt wird,
wenn eine Umleitung stattfindet. */
exit;
?>
replace
Der optionale Parameter replace
gibt an, ob der
Header einen vorhergehenden gleichartigen Header ersetzen 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);
?>
response_code
Forciert einen HTTP-Response-Code des angegebenen Wertes. Dieser
Parameter hat nur einen Effekt, wenn header
nicht leer ist.
Es wird kein Wert zurückgegeben.
Wenn der Header nicht gesendet werden kann, gibt header()
einen Fehler der Stufe E_WARNING
aus.
Beispiel #1 Download-Dialog
Wollen Sie den Benutzer auffordern, die von Ihnen gesendeten Daten, 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');
// Sie wird downloaded.pdf genannt
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// Die ursprüngliche PDF-Datei heißt original.pdf
readfile('original.pdf');
?>
Beispiel #2 Caching-Direktiven
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 die obigen Header nicht ausgeben. Es gibt eine Reihe von Optionen, welche die Benutzer in ihrem 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, wenn Sessions verwendet werden sollen.
Beispiel #3 Setzen eines Cookies
Die Funktion setcookie() bietet eine einfache Möglichkeit, Cookies zu setzen. Um ein Cookie zu setzen, das Attribute enthält, die setcookie() nicht unterstützt, kann die Funktion header() verwendet werden.
Im folgenden Beispiel wird ein Cookie mit dem Attribut
Partitioned
gesetzt.
<?php
header('Set-Cookie: name=value; Secure; Path=/; SameSite=None; Partitioned;');
?>
Hinweis:
Header sind nur dann zugänglich und werden nur dann gesendet, wenn die genutzte SAPI sie unterstützt.
Hinweis:
Sie können die Limitierung, dass Header vor jeglicher Ausgabe gesendet werden müssen, umgehen, indem Sie die Ausgabepufferung verwenden, mit dem Overhead, dass alle Ausgaben an den Browser auf dem Server gepuffert werden, bis Sie diese senden. Sie können dies tun, indem Sie in Ihrem Skript ob_start() und ob_end_flush() verwenden, oder indem Sie die Konfigurationsdirektive
output_buffering
in der php.ini bzw. in den Server-Konfigurationsdateien auf "On" setzen.
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:
Die meisten zeitgemäßen Clients akzeptieren relative URIs als Argument für » Location:, aber einige ältere Clients benötigen einen absoluten URI inklusive dem Schema, Hostnamen und absoluten Pfad. Gewöhnlich können Sie mittels $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] und dirname() aus einem relativen Link einen absoluten URI selbst erstellen:
<?php
/* Weiterleitung 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, selbst wenn session.use_trans_sid eingeschaltet ist. Sie muss daher manuell durch Verwendung der Konstante
SID
hinzugefügt werden.