header
(PHP 4, PHP 5, PHP 7, PHP 8)
header — Sendet einen HTTP-Header in Rohform
Beschreibung
$header
, bool $replace
= true
, int $response_code
= 0): voidheader() 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;
?>
Parameter-Liste
-
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 derErrorDocument
-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 der201
- oder ein3xx
-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 Argumentfalse
ü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.
Rückgabewerte
Es wird kein Wert zurückgegeben.
Fehler/Exceptions
Wenn der Header nicht gesendet werden kann, gibt header()
einen Fehler der Stufe E_WARNING
aus.
Beispiele
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.
Anmerkungen
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.
Siehe auch
- headers_sent() - Prüft, ob oder wo die Header bereits gesendet wurden
- setcookie() - Sendet ein Cookie
- http_response_code() - Get or Set the HTTP response code
- header_remove() - Remove previously set headers
- header_list()
- Den Abschnitt über HTTP-Authentifizierung mit PHP