Artikelbild

Automatische Weiterleitung

Webseiten ändern sich und damit ändern sich auch die Adressen von Ressourcen. Das hat mehrere Gründe, unter anderem können die Umstellung auf ein anderes CMS, die Einführung von SEO-freundlichen URLs oder der Umstieg von HTTP auf HTTPS zu neuen Adressen führen.

Alte Adressen sollten dennoch erreichbar bleiben – zumindest für eine gewisse Zeit. Die wichtigsten Gründe dafür sind:

  • Besucher haben die alten Adressen evtl. in Ihren Favoriten gespeichert und reagieren verärgert, wenn ihnen statt dem gewohnten Seiteninhalt nur noch der Fehler 404 „Webseite nicht gefunden“ präsentiert wird.
  • Bestimmte Ressourcen mögen als API-Adresse fest in Geräten oder in Software konfiguriert sein. Nur weil ein Administrator in guter Absicht seinen Webserver auf HTTPS-Only umstellt, funktionieren diese Geräte oder Programme dann plötzlich nicht mehr.
  • Backlinks, die zum Fehler 404 führen rechnen negativ auf die Suchmaschinenplatzierung der Webseite an.
  • Nicht zuletzt bleiben alte Adressen für geraume Zeit im Gedächtnis diverser Suchmaschinen erhalten.

Dieser Artikel bespricht Möglichkeiten, mit denen all diese Probleme durch Weiterleitungen beseitigt werden können. Dabei liegt der Fokus auf serverseitigen Weiterleitungen.

1. Serverseitige Weiterleitungen

Serverseitige Weiterleitungen bieten enorme Vorteile:

  • Der Server leitet nicht nur weiter, sondern sendet dem Client auch einen entsprechenden Statuscode (301 oder 302) und informeirt ihn dadurch über eine Änderung der Adresse. Suchmaschinen verwenden einen solchen Hinweiscode zur Aktualisierung ihres Index. Browser aktualisieren die Favoriten der Benutzer leider nicht automatisch, wechseln aber zumindest zu neuen Adresse.
  • API-Adressen mögen fest in Software einprogrammiert sein oder händisch in Konfigurationsdateien auf unzähligen Geräten gepflegt sein. Durch eine serverseitige Weiterleitung funktioniert die alte API-URL weiterhin.
  • Backlinks funktionieren weiterhin. Das mag auf den ersten Blick ein unscheinbares Detail sein. Allerdings rechnen Backlinks, die auf nicht existente Seiten verweisen, häufig negativ auf die Suchmaschinenplatzierung an. So kann die teure Investition in SEO-Dienstleistungen das genaue Gegenteil des beabsichtigten Erfolgs erziehlen.
  • Nicht zuletzt bekommt der Besucher von der Änderung zumeißt nichts mit. Er muss nicht seine Favoritenliste aktualisieren. Er muss auch nicht nach einer neuen Adresse suchen. Er muss noch nicht einmal einen Link klicken oder seinem Werbeblocker erlauben, eine clientseitige Weiterleitung (z.B. per Javascript) auszuführen.

Wann immer möglich, sollten Sie also eine serverseitige Weiterleitung bevorzugen.

1a. Die Redirect-Direktive von Apache

Der beliebte Webserver Apache ermöglicht Weiterleitungen mit seiner Direktive Redirect. Andere Webserver bieten ähnliche Möglichkeiten. Die Redirect-Direktive „verlinkt“ von der alten URL auf die neue. Nicht zu verwechseln ist das mit der Alias-Direktive! Redirect kann in der Konfigurationsdatein von Apache httpd.conf oder in der Zugriffskontrolldatei (.htaccess) eingesetzt werden. Letzteres funktioniert allerdings nur, wenn es für das Verzeichnis per AllowOverride-Direktive gestattet wurde. Egal wo, die Syntax von Redirect ist denkbar einfach:

Redirect [<Status>] <Pfad> <URL>

Das erste Argument (Status) ist optional und wird im weiteren Verlauf genauer erklärt.

Das zweite Argument (Pfad) ist der Pfad nach dem Servernamen. Sollte die alte URL http://www.example.com/oldfile lauten, müssen Sie als Pfad also /oldfile angeben. Bei Verzeichnissen muss am Ende ein Slash (/) angegeben werden. Nur dann werden auch Adressen innerhalb des Verzeichnisses weitergeleitet. Lässt man den Slash weg, wird nur das Verzeichnis selbst weitergeleitet, nicht aber sein Inhalt.

Als drittes Argument wird die Ziel-URL angegeben. Soll die Weiterleitung innerhalb der gleichen Domain und im gleichen Schema (http, https usw.) stattfinden, kann das Weiterleitungszeit relativ angegeben werden. Soll zu einer anderen Domain oder in ein anderes Schema umgeleitet werden, muss die komplette URL angegeben werden.

Beispielsweise leitet diese Direktive von einem alten CMS-Verzeichnis auf ein neues um:

Redirect /olddir/ /newdir/

Ein weiteres Beispiel ist die Umleitung sämtlicher Zugriffe von HTTP auf HTTPS:

redirect / https://example.com/

Mit dem Argument Status können Sie dem Client nähre Angaben zu Grund und Dauer der Umleitung machen. Es bietet folgende Optionen:

temp
Der Server sendet den HTTP-Statuscode 302 (found) zurück. Dies ist die Standardeinstellung entspricht dem Verhalten, wenn Sie das Argument Status nicht angeben. Der Client wird damit angewiesen, temporär die neue URL zu nutzen, aber seinen Link zur alten URL nicht zu aktualisieren.

permanent
Der Server sendet den HTTP Statuscode 301 (moved permanently) und teilt dem Client mit, dass die alte URL nie wieder in Betrieb genommen werden wird und er nach Möglichkeit sinen alten Link aktualisieren soll.

seeother
Der Server sendet den HTTP-Statuscode 303 (see other) zurück. Grundsätzlich hat das den gleichen Effekt wie der Status permanent. Allerdings teilen Sie dem Client zusätzlich mit, dass sich nicht nur die Adresse der Ressource, sondern auch ihr Inhalt geändert hat.

gone
Der Server sendet den HTTP-Statuscode 410 (gone). Streng genommen ist das keine Weiterleitung. Allerdings teilen Sie dem Client mehr mit als mit einem einfachen 404 (not found). 410 Berichtet dem Client, dass die Ressource umgezogen ist, Ihnen jedoch die neue URL nicht bekannt ist. Dem Nutzer hilft das erst einmal gar nichts. Suchmaschinen werden jedoch die URL aus ihrem Index entfernen. Bei einem Fehler 404 tun sie das i.d.R. nicht oder zumindest nicht gleich.

Darüber hinaus können beliebige andere HTTP-Statuscodes zurückgegeben werden – z.B. um Ihrer eigenen Client-Anwendung eine spezielle Mitteilung zu machen. Wenn der Code zwischen 300 und 399 liegt, muss ein Weiterleitungsziel angegeben werden. Codes zwischen 400 und 499 weisen auf einen Clientseitigen Fehler hin. Codes zwischen 500 und 599 zeigen dagegen einen Serverseitigen Fehler an.

Neben Redirect gibt es auch die Direktiven RedirectPermanent und RedirectTemp. Diese sind jedoch nur andere Schreibweisen, die das Status-Argument in die Direktive integrieren.

Außerdem gibt es noch die Direktive RedirectMatch, bei der Sie mit regulären Ausdrücken arbeiten können, um komplexe Szenarien abzubilden. Ein Exkurs zu Regulären Ausrücken würde den Umfang dieses Artikels sprengen. Als Beispiel sei hier jedoch die Weiterleitung eines gesamten Verzeichnisses inkl. seines Inhalts von HTTP auf HTTPS gezeigt. Das kann z.B. für ein Admin-Interface Sinn machen:

RedirectMatch permanent /admin/([^.]+) https://example.com/admin/$1

1b. Das Apache-Modul mod_rewrite

Eine Weitere, sehr mächtige Möglichkeit zur Einrichtung von Weiterleitungen ist das Apache-Modul mod_rewrite. Es erlaubt umfangreiche Manipulationen von URLs, die weit über den Bedarf einer einfachen Weiterleitung hinausgehen. Mit ihm werden beispielsweise schicke SEO-URLs generiert. Dadurch kann eine kryptische URL wie https://example.com/index.php?area=public&page=search umgeschrieben werden zu einer einfach lesbaren, für Suchmaschinen optimierten URL wie https://example.com/public/search.

Die Bedienung dieses möchtigen Werkzeugs ist allerdings deutlich umfangreicher als die der Redirect-Direktive. Ob mod_redirect das richtige Werkzeug ist, entscheiden Sie selbst. Beachten Sie dazu dieses Zitat:

„The great thing about mod_rewrite it gives you all the configurability and flexibility of Sendmail. The downside to mod_rewrite is that it gives you all the configurability and flexibility of Sendmail.“

Brian Behldorf, Mitglied der Apache Group

Wie bei den regulären Ausdrücken zuvor kann dieser kleine Artikel keine vollständige Anleitung zur Nutzung von mod_rewrite sein. Auch hier soll ein kleines Beispiel zur Nutzung der Zugriffskontrolldatei .htacces genügen:

Options +FollowSymlinks 
RewriteEngine on
Rewrite Base /
RewriteRile ^old$ /new [R=301]

Die Zeichen ^ und $ zeigen (genau wie bei regulären Ausrücken) den Beginn und das Ende des Suchmusters ausgehend von der Basis-URL an. Das zweite Argument stellt die Ziel-URL dar. Der HTTP-Statuscode 301 (moved permanently) wird hier als optionales, drittes Argument übergeben. Selbstverständlich kann udn soll hier mit regulären Ausrücken gearbeitet werden. Im Gegensatz zu RewriteMatch können auch gleich mehrere Ausrücke in einer einzigen Anweisung genutzt werden.

1c. Weiterleitung mit PHP

Weniger komplex und dennoch sehr mächtig ist die Weiterleitung mit PHP. Über die Funktion header() können Sie dem Client beliebige HTTP-Header übermitteln und so dessen Verhalten direkt beeinflussen. Neben Zeichensätzen, Fehler-Codes und vielem mehr können Sie also den header Location: senden, der den Client dazu veranlasst, auf eine andere URL zu wechseln. Das funktioniert allerdings nur, sofern Sie dem Client bis dahin noch keinen Dokumentinhalt geschickt haben:

<?php
  header("Location: https://example.com/new/url/of/this/file.php");
  exit;
?>

Die Funktion exit; ist steng genommen nicht erforderlich. Allerdings bewirkt sie, dass der Server den Rest des Scripts nicht mehr ausführt. Je nach Umfang Ihrer Anwendung spart das deutlich Rechenzeit für Ihren Server. Alternativ können Sie für Clients, die der Weiterleitung nicht folgen können oder wollen eine nette Nachricht an den Benutzer inklusive dem Versuch einer Client-seitigen Weiterleitung per meta-Tag mitschicken:

<?php
  header("Location: https://example.com/new/url/of/this/file.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
  <head>
    <meta http-equiv="content-type"; content="text/html; charset=utf-8" />
    <meta http-equiv="refresh"; content="1; url=http://example.com/new/" /> 
    <title>Weiterleitung</title>;
  </head>
  <body>
    <h1>Weiterleitung</h1>
    <p>Die gesuchte Ressource wurde nach <a href="http://example.com/new/">example.com/new</a> verschoben.</p>
  </body>
</html>"
<?php
  exit;
?>

Standardmäßig wird auch hier der HTTP-Statuscode 302 verschickt und dem Client damit eine temporäre Weiterleitung angezeigt. Auch das lässt sich selbstverständlich ändern. Je nach PHP-Version muss der Status-Code vor dem Location-Header versand werden, damit er funktioniert. Bei neueren Version ist die Reihenfolge egal:

<?php
  header("Status: 301"); 
  header("Location: https://example.com/new/url/to/this/file.php");
?>

2. Clientseitige Weiterleitung

Eine serverseitige Weiterleitung ist nicht für alle Webautoren realisierbar. Beispielsweise weil kein PHP (und auch keine andere Scriptsprache) zur Verfügung steht. Beispielsweise weil der Server-Admin der .htaccess-Datei per AllowOverride None alle Möglichkeiten entzogen hat. Oder auch, weil LigHTTPd oder NGinx zum Einsatz kommen, die keine Alternative zu .htaccess haben und der Server-Admin keinen Zugang zu den Konfigurationsdateien gewährt.

2a. Weiterleitung per meta-Tag

Die älteste und bekannteste Methode ist die Weiterleitung per meta-Tag. Wie die Bezeichnung http-equiv im Tag-Namen bereits vermuten lässt, wurde dieser Tag geschaffen, um HTTP-header nachzubilden, die aus irgendeinem Grund nicht als Header übermittelt werden können.

Die denkbar einfache Syntax dieses Headers lautet:

<meta http-equiv="refresh"; content="1; url=http://example.com/new/">

Er muss (wie alle anderen meta-Tags auch) zwischen <head> und </head> im Dokument eingefügt werden. Wo genau, spielt keine Rolle. Zusätzlich zur Ziel-URL muss eine Verzögerung in Sekunden (im Beispiel 1) für die Weiterleitung übergeben werden. 0 ist ebenfalls möglich und bedeutet, dass der Browser weiterleitet, sobald er das Dokument vollständig geladen hat.

Da dieser meta-Tag praktisch seit Anbeginn der Zeit zu HTML gehört, wird er von allen Browsern in allen Versionen unterstützt. Allerdings wurde er in der Vergangenheit häufig missbraucht. Einige Werbeblocker machen ihn daher unbrauchbar um ihre Nutzer zu schützen. In vielen Firmen wird er außerdem durch Proxy-Server, Application-Firewalls und sonstige Sicherheitslösungen herausgefiltert, bevor die Webseite im Browser ankommt.

2b. Weiterleitung per JavaScript

Selbstverständlich ist eine Weiterleitung auch mit der weit verbreiteten Sprache JavaScript möglich:

<script type="text/javascript">
  window.location.href='http://example.com/new/url/of/this/file.html';
</script>

Hier ist jedoch die Wahrscheinlichkeit, dass ein Werbeblicker, Virenscanner, Proxyserver oder einfach nur die Browser-Einstellung des Nutzers Ihre Weiterleitung verhindert, extrem hoch. Der Vollständigkeit darf diese Möglichkeit in einem Artikel über Weiterleitungen nicht fehlen. Sie sollte allerdings im 21. Jahrhundert nicht mehr zu Einsatz kommen. Wenn die Weiterleitung clientseitig erfolgen muss, dann am besten per meta-Tag.

Kommentar hinterlassen