Weiterleitungen leiten Besucher automatisch von einer URL zu einer anderen weiter, etwa nach einem Formularversand oder bei geänderten Seitenstrukturen. In PHP übernimmt die Funktion header() diese Aufgabe, indem sie einen HTTP Location-Header an den Browser sendet. In diesem Tutorial lernst du, wie Redirects mit header() funktionieren, welche HTTP-Statuscodes sich eignen und welche typischen Fehler auftreten.

Der folgende Abschnitt zeigt die grundlegende Syntax eines Redirects mit header() und erklärt, warum exit dabei unverzichtbar ist.
Weiterleitung mit header() in PHP
Für eine Weiterleitung wird der Location-Header mit der Ziel-URL gesetzt. Unmittelbar nach dem Aufruf muss das Skript mit exit oder die beendet werden, da PHP sonst den restlichen Code weiter ausführt.
<?php
/* Einfache Weiterleitung auf eine andere Seite */
header('Location: https://www.example.com/neue-seite.php');
exit;
Ohne exit wird der nachfolgende Code trotz gesetztem Location-Header ausgeführt. Nach jeder Weiterleitung mit header() folgt deshalb sofort exit oder die.
<?php
/* Weiterleitung nach erfolgreicher Formularverarbeitung */
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
/* Formulardaten verarbeiten */
$name = htmlspecialchars($_POST['name'] ?? '');
/* Nach Verarbeitung weiterleiten (Post-Redirect-Get-Pattern) */
header('Location: /danke.php');
die;
}
Der Unterschied zwischen 301 und 302 Redirects
Standardmäßig sendet header('Location: ...') einen 302-Statuscode (Temporary Redirect). Für dauerhafte Weiterleitungen muss der Statuscode 301 (Moved Permanently) explizit angegeben werden.
<?php
/* 301: Dauerhafte Weiterleitung (wird vom Browser gecacht) */
header('Location: https://www.example.com/neue-url.php', true, 301);
exit;
/* 302: Temporaere Weiterleitung (Standard, wird nicht gecacht) */
header('Location: https://www.example.com/wartung.php', true, 302);
exit;
Ein 301-Redirect signalisiert Suchmaschinen, dass die alte URL dauerhaft ersetzt wurde. Der Browser speichert diese Weiterleitung im Cache und ist damit ideal für SEO-relevante URL-Änderungen. Ein 302-Redirect wird nicht gecacht und eignet sich für temporäre Umleitungen, etwa während Wartungsarbeiten.
flowchart TD
A[Browser ruft URL auf] --> B{Statuscode}
B -->|301| C[Browser cacht Redirect]
B -->|302| D[Browser cacht nicht]
C --> E[Ziel-URL laden]
D --> E
C --> F[Direkt zur neuen URL]
D --> G[Erneut alte URL fragen]
Der Fehler "headers already sent" und wie man ihn vermeidet
Der häufigste Fehler bei header() lautet: "Cannot modify header information - headers already sent". Er tritt auf, wenn vor dem Aufruf bereits eine Ausgabe an den Browser gesendet wurde, etwa durch echo, HTML-Code oder Leerzeichen vor dem öffnenden PHP-Tag.
Die Lösung ist Output Buffering mit ob_start(). Diese Funktion fängt alle Ausgaben in einem Puffer ab, sodass Header auch nach einer Ausgabe noch gesendet werden können.
<?php
/* Output Buffering aktivieren */
ob_start();
/* Ausgabe, die normalerweise den Fehler ausloesen wuerde */
echo 'Diese Ausgabe wird gepuffert';
/* header() funktioniert trotzdem, weil die Ausgabe im Puffer liegt */
header('Location: /zielseite.php');
exit;
Besser ist es jedoch, das Skript so zu strukturieren, dass Weiterleitungen immer vor jeder Ausgabe stehen. Frameworks wie Laravel oder Symfony setzen dieses Prinzip konsequent um.
Alternativen zur PHP-Weiterleitung (Meta-Refresh, JavaScript, .htaccess)
Nicht immer ist header() die beste Wahl. Ein Meta-Refresh-Tag im HTML-Head leitet den Browser nach einer definierten Anzahl von Sekunden weiter. JavaScript kann Weiterleitungen clientseitig umsetzen. Am effizientesten sind jedoch Weiterleitungen über die .htaccess-Datei, da sie greifen, bevor PHP überhaupt gestartet wird. Die .htaccess-Methode spart Serverressourcen und ist für dauerhafte URL-Änderungen die bevorzugte Lösung.
Query-Parameter bei Weiterleitungen übergeben
Bei einer Weiterleitung müssen häufig zusätzliche Informationen an die Zielseite übermittelt werden. Die Funktion http_build_query() erstellt einen korrekt kodierten Query-String aus einem Array.
<?php
/* Query-Parameter sicher aufbauen und weiterleiten */
$params = [
'status' => 'erfolg',
'meldung' => 'Daten gespeichert'
];
$zielUrl = '/ergebnis.php?' . http_build_query($params);
header('Location: ' . $zielUrl);
exit;
Die Funktion kodiert Sonderzeichen automatisch und schützt vor Injection-Angriffen.
Häufige Fehler und Stolperfallen (Redirect-Schleifen, Open Redirect)
Redirect-Schleifen entstehen, wenn Seite A auf Seite B weiterleitet und Seite B zurück auf Seite A. Der Browser bricht nach einigen Durchläufen mit einer Fehlermeldung ab.
Eine weitere Gefahr sind Open-Redirect-Schwachstellen. Sie entstehen, wenn die Ziel-URL aus Benutzereingaben stammt und nicht validiert wird. Die Lösung ist eine Whitelist erlaubter Ziel-URLs.
<?php
/* Open-Redirect-Schutz durch Whitelist */
$erlaubteZiele = [
'startseite' => '/index.php',
'profil' => '/profil.php',
'dashboard' => '/dashboard.php'
];
$ziel = $_GET['redirect'] ?? 'startseite';
if (isset($erlaubteZiele[$ziel])) {
header('Location: ' . $erlaubteZiele[$ziel]);
exit;
}
/* Fallback bei unbekanntem Ziel */
header('Location: /index.php');
exit;
Eine URL aus $_GET oder $_POST darf niemals direkt in den Location-Header übernommen werden.
Fazit
Die Funktion header() ist das Standardwerkzeug für Weiterleitungen in PHP. Der Aufruf muss vor jeder Ausgabe erfolgen, und exit ist nach dem Location-Header zwingend erforderlich. Für dauerhafte URL-Änderungen eignet sich der Statuscode 301, für temporäre Umleitungen 302. Bei dauerhaften Weiterleitungen ist eine .htaccess-Regel effizienter als eine PHP-Lösung. Query-Parameter werden sicher mit http_build_query() aufgebaut, und Open-Redirect-Schwachstellen lassen sich durch eine Whitelist zuverlässig verhindern.