Permanente Weiterleitung in PHP einrichten
Eine PHP-Weiterleitung mit header("Location: ...") sendet standardmäßig den Statuscode 302. Das bedeutet: temporäre Weiterleitung. Für eine dauerhafte Umleitung - etwa nach einem URL-Wechsel oder einer Domain-Migration - muss der Statuscode 301 gesetzt werden.
Für Besucher macht das keinen Unterschied. Beide Statuscodes leiten zum Ziel weiter. Für Suchmaschinen ist der Unterschied aber entscheidend.
301 vs. 302: Der Unterschied für Suchmaschinen
| Statuscode | Bedeutung | Auswirkung auf SEO |
|---|---|---|
| 301 | Moved Permanently - dauerhaft verschoben | Suchmaschine ersetzt die alte URL im Index durch die neue. Rankings werden übertragen. |
| 302 | Found - vorübergehend verschoben | Suchmaschine behält die alte URL im Index. Rankings bleiben auf der alten Adresse. |
| 307 | Temporary Redirect | Wie 302, aber die HTTP-Methode (GET, POST) bleibt erhalten. Wichtig bei Formularen. |
Wer eine URL dauerhaft umzieht und den 302-Standard von PHP nicht überschreibt, verliert im schlimmsten Fall die bestehenden Rankings. Die alte Adresse bleibt im Index, die neue wird als Kopie gewertet. Mehr zum Statuscode 302 in unserem separaten Artikel.
Der Statuscode 307 ist das modernere Pendant zu 302. Der Unterschied: Bei einem 302 darf der Browser die HTTP-Methode ändern (ein POST wird oft zu einem GET). Bei 307 ist das verboten - die Methode bleibt erhalten. Das ist relevant, wenn ein Formular-POST umgeleitet wird und die Daten nicht verloren gehen dürfen.
Code-Beispiel: PHP 301-Weiterleitung
Die kürzeste Variante mit einem Aufruf:
<?php
header("Location: https://www.beispiel.de/neue-seite/", true, 301);
exit;
Der dritte Parameter 301 setzt den HTTP-Statuscode. true ersetzt einen eventuell bereits gesetzten Location-Header. Das exit am Ende ist wichtig - ohne wird das restliche Script weiter ausgeführt, obwohl der Redirect schon gesendet wurde.
Die ausführlichere Variante macht dasselbe, ist aber besser lesbar:
<?php
// Statuscode 301 setzen
http_response_code(301);
// Ziel-URL angeben
header("Location: https://www.beispiel.de/neue-seite/");
// Script beenden
exit;
http_response_code(301) existiert seit PHP 5.4 und ist die modernere Alternative zu header("HTTP/1.1 301 Moved Permanently").
Praxisbeispiele
Einzelne Seite umleiten
<?php
// alte-seite.php leitet auf neue URL um
header("Location: https://www.beispiel.de/neue-seite/", true, 301);
exit;
HTTP auf HTTPS umleiten
<?php
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') {
header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], true, 301);
exit;
}
Domain-Wechsel (alle URLs)
<?php
if ($_SERVER['HTTP_HOST'] === 'alte-domain.de' || $_SERVER['HTTP_HOST'] === 'www.alte-domain.de') {
header("Location: https://www.neue-domain.de" . $_SERVER['REQUEST_URI'], true, 301);
exit;
}
www erzwingen
<?php
if ($_SERVER['HTTP_HOST'] === 'beispiel.de') {
header("Location: https://www.beispiel.de" . $_SERVER['REQUEST_URI'], true, 301);
exit;
}
Typische Fehler
Ausgabe vor dem header()-Aufruf
Der häufigste Fehler. Vor header() darf keine Ausgabe an den Browser erfolgen - kein echo, kein HTML, nicht einmal ein Leerzeichen oder eine leere Zeile vor dem <?php-Tag. Sonst erscheint die Fehlermeldung:
Warning: Cannot modify header information - headers already sent
Lösung: Stellen Sie sicher, dass vor dem <?php kein Zeichen steht. Auch keine BOM (Byte Order Mark) - speichern Sie die Datei als UTF-8 ohne BOM.
Fehlende exit-Anweisung
Ohne exit nach dem header()-Aufruf läuft das PHP-Script weiter. Das kann dazu führen, dass vertrauliche Daten trotz Redirect ausgegeben werden. Immer exit; oder die(); nach der Weiterleitung setzen.
Relative statt absolute URLs
Im Location-Header sollte immer eine vollständige URL stehen - mit Protokoll und Domain. Relative Pfade wie /neue-seite/ funktionieren in den meisten Browsern, entsprechen aber nicht dem HTTP-Standard (RFC 7231) und können in Edge Cases zu Problemen führen.
Weiterleitungsschleifen
Seite A leitet auf Seite B, Seite B leitet zurück auf Seite A. Browser erkennen das nach einigen Durchläufen und zeigen "ERR_TOO_MANY_REDIRECTS". Prüfen Sie die Weiterleitungskette, bevor Sie einen neuen Redirect einrichten.
PHP-Redirect vs. .htaccess-Redirect
Weiterleitungen lassen sich auch über die .htaccess-Datei einrichten. Was ist wann besser?
| Kriterium | PHP | .htaccess |
|---|---|---|
| Geschwindigkeit | PHP-Interpreter wird gestartet | Wird direkt vom Apache verarbeitet - schneller |
| Flexibilität | Volle Programmierlogik (Datenbank, Session, Bedingungen) | Nur URL-Muster und Server-Variablen |
| Zugriff nötig | PHP-Dateien | Server-Konfiguration (.htaccess) |
| Einsatzgebiet | Dynamische Entscheidungen (Login, Sprache, A/B-Tests) | Statische URL-Umschreibungen, Domain-Redirects |
Für einfache URL-Weiterleitungen ist .htaccess die bessere Wahl - schneller und ohne PHP-Overhead. PHP-Redirects sind dann sinnvoll, wenn die Weiterleitung von einer Bedingung abhängt, die nur PHP prüfen kann.
Redirect prüfen
Ob der richtige Statuscode gesendet wird, lässt sich mit den im Artikel Statuscode ermitteln beschriebenen Werkzeugen prüfen. Das Ergebnis sollte 301 Moved Permanently und die korrekte Ziel-URL zeigen.
Alternativ über die Kommandozeile:
curl -I https://www.beispiel.de/alte-seite.php
Die Ausgabe zeigt den Statuscode und den Location-Header:
HTTP/1.1 301 Moved Permanently
Location: https://www.beispiel.de/neue-seite/
Häufige Fragen
Muss ich 301 oder 302 verwenden?
301 für dauerhafte Weiterleitungen (URL-Wechsel, Domain-Umzug). 302 nur, wenn die Umleitung wirklich temporär ist - etwa bei Wartungsarbeiten oder A/B-Tests. Im Zweifel 301.
Überträgt ein 301-Redirect die Rankings?
Ja. Google behandelt 301-Redirects als Signal, die Rankings von der alten auf die neue URL zu übertragen. Das passiert nicht sofort, aber innerhalb weniger Wochen.
Kann ich mehrere Weiterleitungen hintereinander schalten?
Technisch ja, aber vermeiden Sie Ketten (A -> B -> C). Jeder Zwischenschritt kostet Ladezeit und kann dazu führen, dass Suchmaschinen die Kette nicht vollständig verfolgen. Leiten Sie immer direkt auf das endgültige Ziel um.
Funktioniert header() auch mit Nginx?
Ja. header() ist eine PHP-Funktion und funktioniert unabhängig vom Webserver. Die Alternative über die Serverkonfiguration wäre bei Nginx ein return 301 in der Server-Config statt einer .htaccess-Regel.
Verwandte Artikel
- PHP Redirect 302 - temporäre Weiterleitung
- .htaccess - Weiterleitungen ohne PHP
- Statuscode ermitteln - prüfen, ob der Redirect korrekt funktioniert
- 301-Weiterleitung und SEO - Auswirkungen auf Rankings
- Weiterleitung HTTP nach HTTPS
Kommentararchiv 23
Die meisten Kommentare drehen sich um die Frage, ob PHP-Redirects gegenüber .htaccess-Weiterleitungen Vor- oder Nachteile haben. Tenor: Für SEO macht es keinen Unterschied, weil der HTTP-Header identisch ist. Mehrere Leser empfehlen .htaccess für einfache Massen-Redirects und PHP für Einzelfälle, die nie geändert werden. Weitere Themen: der trailing Slash am Ende der URL, Joomla-Weiterleitungen mit Query-Parametern und der Redirect von PDF-Dateien auf neue Versionen.