Die header()
-Funktion in PHP sendet einen rohen HTTP-Header an den Browser. Sie ist das Werkzeug, mit dem dein Server dem Browser Anweisungen gibt, bevor er den eigentlichen HTML-Inhalt sendet.
Stell dir eine Postkarte vor: Der Header ist die Adresse, der Absender und der Poststempel auf der Vorderseite. Der Inhalt (HTML, Text, etc.) ist die Nachricht auf der Rückseite. Die header()
-Funktion schreibt auf die Vorderseite der Karte.
Was macht die Funktion?
Mit header()
kannst du das Verhalten des Browsers steuern. Die drei häufigsten Anwendungsfälle sind:
1. Weiterleitungen (Redirects) ↪️
Das ist der bekannteste Anwendungsfall. Du kannst den Browser anweisen, sofort eine andere Seite zu laden. Das ist nützlich nach einer Formulareingabe, einem Login oder wenn eine Seite umgezogen ist.
PHP
<?php
// Logik zur Überprüfung des Logins...
if ($login_erfolgreich) {
// Sende den Befehl "Gehe zu dieser neuen URL" an den Browser
header('Location: /dashboard.php');
exit(); // Wichtig: Skript danach beenden!
}
?>
Der Browser erhält diesen Header, bricht das Laden der aktuellen Seite ab und fordert stattdessen /dashboard.php
an. Der Nutzer sieht die ursprüngliche Seite nie.
2. Den Content-Type
(Inhaltstyp) festlegen 📄
Du kannst dem Browser mitteilen, welche Art von Daten er gleich empfangen wird, damit er sie korrekt darstellen kann. Standardmäßig sendet PHP Content-Type: text/html
. Du kannst dies aber ändern, um zum Beispiel eine JSON-Antwort für eine API, ein Bild oder eine CSV-Datei zu generieren.
PHP
<?php
// Anweisung an den Browser: "Achtung, es kommt kein HTML, sondern JSON!"
header('Content-Type: application/json');
$data = ['userId' => 123, 'name' => 'Peter'];
echo json_encode($data); // Gib die Daten als JSON-String aus
?>
Ein anderes Beispiel wäre das Erzwingen eines Downloads:
PHP
<?php
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="download.zip"');
// ... hier den Inhalt der ZIP-Datei ausgeben ...
?>
3. Caching-Verhalten steuern ⏱️
Du kannst dem Browser sagen, ob und wie lange er eine Seite im Cache (Zwischenspeicher) behalten soll. Das ist wichtig, um die Ladezeiten zu optimieren oder sicherzustellen, dass Nutzer immer die aktuellste Version einer Seite sehen.
PHP
<?php
// Anweisung an den Browser: "Diese Seite niemals zwischenspeichern."
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
?>
Die wichtigste Regel: Keine Ausgabe vorher!
Das ist die häufigste Fehlerquelle im Zusammenhang mit header()
.
Du darfst header()
nur aufrufen, bevor irgendeine Form von Ausgabe an den Browser gesendet wurde.
Sobald dein Skript auch nur ein einziges Zeichen – sei es ein Leerzeichen, eine HTML-Zeile oder eine echo
-Ausgabe – an den Browser sendet, werden die HTTP-Header automatisch „abgeschlossen“ und gesendet. Danach kannst du keine weiteren Header mehr hinzufügen.
Falsch (führt zum „Headers already sent“-Fehler):
PHP
<!DOCTYPE html> <html>
<head>
<title>Fehler</title>
</head>
<body>
<?php
// ZU SPÄT! Der HTML-Code oben hat die Header bereits gesendet.
header('Location: /neue-seite.php');
exit();
?>
</body>
</html>
Richtig (PHP-Logik steht komplett am Anfang):
PHP
<?php
// Komplette PHP-Logik hier oben
if (bedingung) {
header('Location: /neue-seite.php');
exit();
}
// Erst hier beginnt die HTML-Ausgabe
?>
<!DOCTYPE html>
<html>
<head>
<title>Meine Seite</title>
</head>
<body>
<h1>Willkommen!</h1>
</body>
</html>
Denk immer an die Postkarten-Analogie: Sobald du anfängst, die Nachricht auf die Rückseite zu schreiben (HTML-Ausgabe), kannst du die Adresse auf der Vorderseite nicht mehr ändern (Header senden).