Weiterleitungen mit PHP

Dieser Artikel bietet eine Alternative zum Redirect per Apache RewriteRule oder ähnlichen Verfahren anderer Webserver. Eine weniger komplexe und trotzdem sehr mächtige Möglichkeit der Weiterleitung bietet PHP. Mit Hilfe der Funktion header() lassen sich Zeilen direkt in den HTTP-Header einfügen, sodass der HTTP-Response direkt beeinflusst werden kann. Damit bleiben Sie vom Werbserver unabhängig und haben mehr Einflussmöglichkeiten.

<?php
header("Location: http://www.emscherwasser.de/kontakt/");
exit();
?>

Die Funktion exit() bewirkt, dass das Parsen des aktuellen Dokumentes abgebrochen wird. Dies spart nicht nur Ressourcen des Servers. Auch sorgt der Abbruch dafür, dass kein Body erzeugt wird. Für spezielle Clients, die der Weiterleitung nicht folgen können oder wollen, kann aber ein Body erzeugt werden:

<?php
header("Location: http://www.emscherwasser.de/kontakt/");
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"\n";
echo "\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n";
echo "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"de\">\n";
echo "<head>\n";
echo "<title>Weiterleitung</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<p>Dies ist eine Weiterleitung zu ";
echo "<a href=\"http://www.emscherwasser.de/kontakt/\">www.emscherwasser.de/kontakt/</a>.</p>\n";
echo "</body>\n";
echo "</html>\n";
exit();
?>

Wenn benutzerdefinierte Header gesendet werden sollen, muss allerdings sicher gestellt sein, dass keine Ausgabe vor dem Senden der Header erfolgt. Die sicherste Methode ist, das PHP-Skript so zu schreiben, dass die header()-Funktion vor jeglicher Ausgabe erfolgt. Bedenken Sie, dass ein Whitespace außerhalb der Markierungen <?php und ?> ebenfalls eine Ausgabe darstellt!

Standardmäßig wird auch hier der Statuscode 302 versendet. Wollen Sie eine permanente Weiterleitung, so fügen Sie in obiges Skript noch die folgende Zeile ein:

header("Status: 301");

Auch ist zu beachten, dass HTTP/1.1 einen absoluten URI erwartet, auch wenn viele Clients mit relativen URIs umgehen können. Der folgende Header ist also unzulässig:

header("Location: /kontakt/");

Falls Sie innerhalb des PHP-Skriptes nicht wissen, auf welcher Domain das Skript läuft, können Sie die Server-Variable $_SERVER["HTTP_HOST"] nutzen, um einen zulässigen Header zu erzeugen:

header("Location: http://".$_SERVER["HTTP_HOST"]."/kontakt/");