Einleitung: Warum ein Redirect in PHP mehr ist als nur header('Location:')
\n\nJeder, der schon einmal in PHP programmiert hat, stand vor der Aufgabe, einen Benutzer auf eine andere Seite weiterzuleiten. Es scheint einfach: Eine Zeile header('Location: /neue-seite'); – und fertig. In der Praxis wird dieser einfache Mechanismus jedoch für Tausende von Entwicklern zum Kopfzerbrechen. Nicht umsonst hat die Frage „How do I make a redirect in PHP?“ auf Stack Overflow Millionen von Aufrufen gesammelt.
Das Problem ist, dass ein Redirect in PHP nicht nur ein Funktionsaufruf ist, sondern ein ganzer Prozess, der leicht gestört werden kann. Haben Sie schon einmal den Fehler „Cannot modify header information“ gesehen? Oder bemerkt, dass der Redirect funktioniert, die Seite aber trotzdem geladen wird? Oder, noch schlimmer, erlebt, dass der Redirect gar nicht funktioniert und der Benutzer eine leere Seite sieht?
\n\nIn diesem Artikel analysieren wir die 5 häufigsten Fehler beim Erstellen eines Redirects in PHP, lernen, wie man sie behebt, und erfahren, wie man die Weiterleitung sicher und vorhersagbar macht. Los geht's!
\n\nFehler Nr. 1: Redirect nach der Ausgabe von Inhalt (Header already sent)
\n\nDas Problem
\nDer häufigste Anfängerfehler ist der Versuch, einen HTTP-Header Location zu senden, nachdem bereits HTML-Code oder auch nur ein Leerzeichen an den Browser gesendet wurde. PHP gibt einen fatalen Fehler aus: „Cannot modify header information - headers already sent“.
Warum passiert das?
\nDas HTTP-Protokoll ist so aufgebaut, dass Header vor dem Antwortkörper gesendet werden müssen. Sobald PHP etwas auf dem Bildschirm ausgibt (über echo, print, oder sogar eine leere Zeile vor <?php), sind die Header bereits festgelegt. Sie können nicht mehr geändert werden.
Beispiel für den Fehler
\n<?php\necho "Hallo!";\nheader('Location: /dashboard.php'); // FEHLER: Header bereits gesendet\n?>\n\nWie man es behebt
\n- \n
- Regel Nr. 1: Rufen Sie
header()vor jeder Ausgabe auf, einschließlich Leerzeichen und HTML \n - Regel Nr. 2: Stellen Sie sicher, dass in Ihrer PHP-Datei keine Leerzeichen oder leeren Zeilen vor
<?phpoder nach?>vorhanden sind \n - Regel Nr. 3: Verwenden Sie die Ausgabepufferung, wenn eine frühe Ausgabe unvermeidbar ist \n
<?php\n// Richtig: Redirect vor jeder Ausgabe\nheader('Location: /dashboard.php');\nexit;\n?>\n\nAusgabepufferung (fortgeschrittene Methode):
\n<?php\nob_start(); // Pufferung aktivieren\necho "Temporärer Inhalt";\nheader('Location: /dashboard.php');\nob_end_flush(); // Alles auf einmal senden\nexit;\n?>\n\nFehler Nr. 2: Vergessenes exit (oder die) nach dem Redirect
\n\nDas Problem
\nDer Aufruf von header('Location: ...') stoppt die Ausführung des Skripts nicht automatisch. PHP verarbeitet den Code weiter, während der Browser nach Erhalt des Headers beginnt, die neue Seite zu laden. Was aber, wenn nach dem Redirect ressourcenintensiver Code oder, noch gefährlicher, Code folgt, der Daten in der Datenbank ändert?
Beispiel für den Fehler
\n<?php\nheader('Location: /erfolg.php');\n// Benutzer wird bereits umgeleitet, aber PHP arbeitet weiter!\nupdate_user_balance($userId, -1000); // GEFÄHRLICH: Abbuchung\nsend_email_to_admin("Benutzer hat einen Kauf getätigt");\n?>\n\nWie man es behebt
\nVerwenden Sie immer exit (oder die) direkt nach dem Aufruf von header(). Dies stellt sicher, dass das Skript beendet wird und kein unnötiger Code mehr ausgeführt wird.
<?php\nheader('Location: /erfolg.php');\nexit; // Vollständiger Stopp des Skripts\n// Der folgende Code wird nicht mehr ausgeführt\nupdate_user_balance($userId, -1000);\n?>\n\nFehler Nr. 3: Falsche URL (relativ vs. absolut)
\n\nDas Problem
\nDer HTTP-Standard verlangt, dass der Wert des Location-Headers