PHP header() Funktion: Alles, was Sie wissen müssen
Die PHP header() Funktion ermöglicht das Setzen von HTTP-Headern, um Weiterleitungen, Downloads, Statuscodes und Caching zu steuern.
Jede HTTP-Antwort, die ein Webserver sendet, besteht aus zwei Teilen: einem Satz von Headern (Metadaten wie Inhaltstyp, Caching-Regeln und Statuscode), gefolgt vom Antwort-Body (dem HTML, JSON, Bild oder der Datei, die der Browser empfängt). PHPs header() Funktion ermöglicht es Ihnen, diese Header aus Ihrem Skript heraus zu schreiben — so können Sie Benutzer weiterleiten, Downloads bereitstellen, den Inhaltstyp festlegen, Caching steuern und benutzerdefinierte Statuscodes senden.
Dieser Leitfaden behandelt die Syntax und Parameter von header(), die eine Regel, über die fast jeder stolpert (der Fehler „headers already sent"), sowie die häufigsten praxisnahen Anwendungsfälle.
Was ist die header() Funktion?
header() ist eine in PHP integrierte Funktion, die einen rohen HTTP-Header an den Client sendet. Ein Header ist eine einzelne Zeile wie Content-Type: text/html oder Location: /login, die der Browser vor dem Seiteninhalt liest. Da die Header in der Antwort zuerst kommen, funktioniert header() nur, solange PHP noch diesen Header-Abschnitt aufbaut — siehe die Regel „headers already sent" weiter unten.
Syntax und Parameter
header(string $header, bool $replace = true, int $response_code = 0): void| Parameter | Typ | Beschreibung |
|---|---|---|
$header | string | Die zu sendende Header-Zeile, z. B. "Content-Type: application/json". |
$replace | bool | Ob dieser Aufruf einen vorherigen Header mit demselben Namen ersetzt. Bei false werden mehrere Header mit demselben Namen gesendet. Standardmäßig true. |
$response_code | int | Erzwingt den HTTP-Statuscode der Antwort. 0 (der Standardwert) bedeutet „Status unverändert lassen". |
Die Funktion gibt nichts zurück (void). Sie teilt Ihnen nicht mit, ob der Header akzeptiert wurde — wenn bereits Ausgabe gesendet wurde, gibt sie stattdessen eine Warnung aus.
Einen Header setzen
Die einfachste Verwendung besteht darin, zu deklarieren, welche Art von Inhalt die Antwort enthält. Dies ist wichtig, wenn Ihr Skript JSON, XML, reinen Text oder eine Datei anstelle von HTML zurückgibt:
<?php
header("Content-Type: application/json");
echo json_encode(["status" => "ok", "id" => 42]);Der Content-Type-Header teilt dem Browser mit, den Body als JSON zu behandeln, sodass er {"status":"ok","id":42} als Daten analysiert, anstatt es als Webseite darzustellen.
Die Regel „headers already sent"
Dies ist das Wichtigste, was Sie über header() wissen müssen: Es muss aufgerufen werden, bevor irgendeine Ausgabe Ihr Skript verlässt. Ausgabe umfasst HTML, echo/print, var_dump() und sogar ein unbeabsichtigtes Leerzeichen oder eine Leerzeile vor dem öffnenden <?php-Tag. Sobald ein Byte des Body gesendet wurde, ist der Header-Abschnitt geschlossen und PHP gibt aus:
Warning: Cannot modify header information - headers already sentEs gibt zwei Möglichkeiten, dies zu vermeiden:
<?php
// 1. Check first — useful when a header is optional
if (!headers_sent()) {
header("X-Powered-By: MyApp");
}
// 2. Buffer output so nothing is flushed until you choose to
ob_start(); // capture everything that gets echoed
echo "page content...";
header("X-Cache: MISS"); // still works — body is held in the buffer
ob_end_flush(); // now send headers + buffered body togetherEine häufige Ursache ist ein Editor, der die Datei mit einem UTF-8-BOM oder einem Zeilenumbruch nach ?> speichert. Das vollständige Weglassen des schließenden ?>-Tags in reinen PHP-Dateien ist die empfohlene Methode, um dies zu vermeiden.
Häufige Anwendungsfälle
Weiterleitung zu einer anderen URL
Senden Sie einen Location-Header und beenden Sie dann das Skript, damit kein weiterer Code ausgeführt wird:
<?php
header("Location: https://example.com/login");
exit; // always exit after a redirectStandardmäßig ist dies eine 302 Found-Weiterleitung (temporär). Für einen dauerhaften Umzug übergeben Sie 301 als Statuscode, damit Suchmaschinen ihren Index aktualisieren:
<?php
// 301 Moved Permanently
header("Location: https://example.com/new-page", true, 301);
exit;Einen benutzerdefinierten Statuscode senden
Sie können einen Status ohne Weiterleitung setzen — zum Beispiel für eine API, die „not found" zurückgibt:
<?php
header("HTTP/1.1 404 Not Found");
// or, more portably:
header("Status: 404 Not Found", true, 404);
echo "Resource not found";Für Statuscodes speziell ist die dedizierte Funktion http_response_code() klarer und leichter zu lesen.
Einen Dateidownload erzwingen
Kombinieren Sie Content-Type mit Content-Disposition: attachment, damit der Browser die Datei speichert, anstatt sie anzuzeigen:
<?php
$file = "report.pdf";
header("Content-Type: application/pdf");
header("Content-Disposition: attachment; filename=\"$file\"");
header("Content-Length: " . filesize($file));
readfile($file); // stream the file to the client
exit;Siehe readfile() zum Streamen des Dateiinhalts an die Ausgabe.
Browser-Caching steuern
Mit Headern können Sie dem Browser mitteilen, ob (und wie lange) er eine Antwort wiederverwenden darf:
<?php
// Tell the browser never to cache this response
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Expires: 0");Mehrere Header mit demselben Namen senden
Die meisten Header ersetzen alle vorherigen mit demselben Namen. Setzen Sie das zweite Argument auf false, wenn Sie tatsächlich mehr als einen benötigen (selten, aber für manche Header gültig):
<?php
header("X-Sample: first");
header("X-Sample: second", false); // both X-Sample headers are sentVerwandte Funktionen
header() schreibt jeweils einen Header, aber PHP hat übergeordnete Hilfsfunktionen für die häufigsten Fälle:
setcookie()undsetrawcookie()— setzen einenSet-Cookie-Header, ohne ihn manuell formatieren zu müssen. Siehe PHP Cookies.http_response_code()— Statuscode lesen oder setzen.- PHP Sessions —
session_start()selbst sendet Cookie-Header, daher gilt dieselbe Anforderung „vor der Ausgabe".
Um tiefer in die Definition und den Aufruf eigener Funktionen einzutauchen, siehe PHP Functions.
Fazit
Die header() Funktion ist Ihre direkte Verbindung zu den HTTP-Antwort-Headern in PHP. Die Regeln sind einfach: Erstellen Sie den Header-String, rufen Sie header() vor jeglicher Ausgabe auf und verwenden Sie exit nach einer Weiterleitung. Damit können Sie Benutzer weiterleiten, Inhaltstypen festlegen, Downloads bereitstellen, Statuscodes senden und Caching steuern — die Bausteine fast jeder dynamischen PHP-Antwort.