301 Redirects

Der Begriff 301 Redirect bezeichnet eine permanente Weiterleitung einer Webadresse auf eine andere. Wir erklären die technischen Hintergründe und zeigen, wie man den Redirect 301 mit der htaccess-Datei auf dem Server einrichtet.

Wofür werden 301 Redirects benötigt?

Beim 301 Redirect handelt es sich um die bekannteste Art der Weiterleitung. Dabei bezieht sich die Zahl 301 auf den zu Grunde liegenden HTTP-Status-Code. Während der Status-Code 404 anzeigt, dass die angeforderte Ressource nicht gefunden werden kann, bezeichnen die 300er-Codes Redirects, zu Deutsch „Weiterleitungen“. Generell dienen 301 Redirects dazu, 404-Fehler zu verhindern.

Wir geben eine Übersicht der wichtigsten HTTP-Status-Codes im Zusammenhang mit Weiterleitungen:

HTTP-Status-Code Erklärung
200 OK Der Server hat eine Ressource unter der abgefragten Adresse gefunden und liefert selbige zurück.
301 Moved Permanently Die Ressource unter der abgefragten Adresse ist permanent unter einer neuen Adresse verfügbar, die der Server zurückliefert. Die alte Adresse ist nicht mehr gültig.
302 Found Die Ressource unter der abgefragten Adresse ist temporär unter einer neuen Adresse verfügbar, die der Server zurückliefert. Die alte Adresse wird in Zukunft eventuell wieder gültig sein.
303 See Other Ähnlich wie 302, jedoch sind beim Aufruf der temporären Adresse nur GET-Anfragen zulässig.
307 Temporary Redirect Ähnlich wie 302; im Unterschied zu 303 darf der Client beim Aufruf der temporären Adresse die HTTP-Methode (GET, POST, PUT, etc.) ändern.
404 Not Found Der Server kann unter der abgefragten Adresse keine Ressource finden.

301-Weiterleitung zum Migrieren von Inhalten

Webinhalte, auch als Ressourcen bekannt, sind unter Webadressen verortet. Manchmal werden Inhalte migriert, d. h. der Inhalt bleibt gleich, doch die Adresse ändert sich. Das ist u. a. der Fall bei der Umstellung von HTTP auf HTTPS, beim Umzug einer Site auf eine neue Domain oder einer Anpassung der Linkstruktur für Suchmaschinenoptimierung. In allen Fällen möchte man vermeiden, dass Nutzer und Nutzerinnen, die auf bestehende Adressen zugreifen, ins Leere laufen.

Kann der Server einer Adresse keine Ressource zuordnen, gibt er den HTTP-Fehler 404 „Not Found“ zurück. Für Nutzende ist dies ärgerlich, weil dann kein Zugriff auf die gewünschte Ressource möglich ist. Wird die Adresse statt von einem Menschen von einem Webcrawler aufgerufen, führen 404-Fehler zum De-Indizieren der zugehörigen Ressource. Beide Szenarien versuchen Website-Betreibende tunlichst zu vermeiden.

301-Weiterleitungen für Suchmaschinenoptimierung

Außer für Adressänderungen von Webinhalten sind 301-Weiterleitungen essenziell für die Suchmaschinenoptimierung (SEO) und das Onlinemarketing. So kommen 301-Weiterleitungen zum Erzeugen der für SEO bedeutsamen „Pretty URLs“ und „Canonical URLs“ zum Einsatz. Auch die zum Verbreiten von Landingpages auf Social Media beliebten URL-Shortener setzen intern auf Redirects des Typs 301.

Warum sind 301-Weiterleitungen nun so wichtig für SEO? Anders als bei den verwandten Weiterleitungen 302, 303 und 307 wird nur beim 301 Redirect der „Link Juice“ der ursprünglichen Adresse auf die neue Adresse übertragen. Hat eine Suchmaschine einen Inhalt indiziert und als positiv bewertet, lässt sich die Adresse per 301-Weiterleitung neu setzen, ohne dass die Bewertung verloren ginge. So machen 301 Redirects komplexe SEO-Strategien wie die Multiple-Domain-Strategie erst möglich.

Wie funktionieren 301 Redirects?

301-Weiterleitungen kommen beim Austausch zwischen Webservern und Clients zum Tragen. Der Server zeigt dem Client an, dass die gewünschte Ressource unter der abgefragten Webadresse (URL) nicht mehr verfügbar ist und übergibt die nunmehr gültige Adresse. Beim Client kann es sich sowohl um den Browser eines menschlichen Nutzers bzw. einer Nutzerin als auch um einen Suchmaschinen-Bot handeln.

  1. Der Client versucht, auf die Ressource unter der URL zuzugreifen.
  2. Der Server antwortet mit Status-Code 301 „Moved Permanently“ und übergibt im HTTP-Location-Header die neue URL für den Zugriff auf die Ressource.
  3. Der Client speichert die neue URL im Cache; zukünftige Zugriffe auf die alte URL gehen sofort an die neue URL.
  4. Der Client versucht, die Ressource unter der neuen URL abzurufen.

Der Ablauf lässt sich mit dem beliebten Netzwerk-Tool cURL veranschaulichen. Wir rufen die IONOS-Homepage unter "http://ionos.de" auf und nutzen die Option --head, um den HTTP-Response-Header auszugeben:

curl --head http://ionos.at                                                                                                                                                                                                                                                                                                                                   
bash

Der IONOS-Server antwortet mit dem HTTP-Status-Code „301 Moved Permanently“, der Location-Header enthält die neue Adresse "https://www.ionos.at/". Wie wir sehen, befindet sich die Homepage unter der WWW-Subdomain und nutzt das HTTPS-Protokoll. Als nächstes weisen wir cURL zusätzlich mit der Option --location an, dem 301 Redirect zu folgen:

curl --head --location http://ionos.at                                                                                                                                                                                                                                                                                                                                   
bash

Nun gibt cURL die Header zweier Verbindungen aus. Beim zweiten Aufruf antwortet der Server mit Status-Code „200 OK“; die Ressource wurde gefunden, der Inhalt wird im Response-Body übermittelt. Derselbe Prozess läuft im Hintergrund in Ihrem Browser ab, wenn Sie die Adresse dort eingeben.

Redirect 301 per htaccess-Datei definieren

Wir haben gesehen, welche Rolle 301-Weiterleitungen beim Austausch zwischen Server und Client spielen. Doch wie lassen sich auf dem Server 301 Redirects festlegen? Dazu gibt es verschiedene Ansätze; einer der am häufigsten eingesetzten besteht darin, Weiterleitungsdirektiven in der htaccess-Datei des Apache-Webservers zu definieren. Damit das funktioniert, müssen die entsprechenden Apache-Module aktiv sein:

Direktiven Apache-Modul Erklärung
Redirect mod_alias Einfache Weiterleitungen
Rewrite mod_rewrite Komplexe Weiterleitungen

Einfache Redirects für 301-Weiterleitung in htaccess-Datei

Schauen wir uns zunächst an, wie sich einfache Redirects vom Typ 301 in der htaccess-Datei definieren lassen. Wir nutzen dazu die Redirect-Direktiven des Moduls mod_alias. Diese eignen sich, wenn es darum geht, eine URL auf dem Server zu einer anderen URL weiterzuleiten. Das Muster ist ganz einfach:

Redirect 301 "/source_path" "target_URL"
apacheconf

Leiten wir zunächst eine URL auf dem Server zu einer anderen internen URL um. Der Schrägstrich am Anfang bezeichnet den Anfang des URL-Pfads, also den Teil nach der Domain:

Redirect 301 "/old.html" "/new.html"
apacheconf

Möchten wir stattdessen auf eine externe URL verweisen, notieren wir diese als Ziel:

Redirect 301 "/old.html" "http://example.com/new.html"
apacheconf

Per Redirect-Direktive lassen sich auch 301-Weiterleitungen ganzer Verzeichnisse in der htaccess-Datei definieren. Wir leiten alle URLs, die mit der Pfad-Komponente „de“ beginnen, auf eine Subdomain um:

Redirect 301 "/de/" "http://de.example.com/"
apacheconf

Nach demselben Schema lassen sich alle URLs einer Domain auf eine andere Domain weiterleiten:

Redirect 301 "/" "http://other.example.com/"
apacheconf

Möchte man viele einzelne Adressen umleiten, die einem gewissen Muster folgen, wird das Notieren einzelner Redirects schnell umständlich. Dann greift man zur verwandten RedirectMatch-Direktive. Diese nutzt einen regulären Ausdruck, um Muster zu erkennen und Teile davon zu extrahieren:

RedirectMatch 301 regex URL
apacheconf

Wir zeigen hier exemplarisch einen RedirectMatch-Eintrag, der Kategorie und ID eines Artikels aus den GET-Parametern extrahiert und in den Pfad umschreibt:

RedirectMatch 301 "/article.php?cat=(.*)&id=(.*)" "/articles/$1/$2/"
apacheconf

Stellen wir uns vor, die Domain wäre "example.com". Dann würde die URL "http://example.com/article.php?cat=web&id=42" umgeleitet auf "http://example.com/articles//web/42/".

Komplexe Redirects für 301-Weiterleitung in htaccess-Datei

Zum Erstellen von 301-Weiterleitungen für komplexe Anwendungsfälle nutzt man die Rewrite-Direktiven des Apache-Umleitungsmoduls mod_rewrite. Damit lassen sich Weiterleitungskonditionen definieren und abfragen, Umgebungsvariablen setzen und auslesen und Weiterleitungsregeln mit regulären Ausdrücken definieren.

Mit mod_rewrite ist es möglich, Weiterleitungsregeln zu verketten; das Modul liefert quasi eine Mini-Programmiersprache zum Umformen von URLs und Auslösen von Redirects. Dabei ist Vorsicht geboten, denn ein fehlerhafter Einsatz kann Endlosschleifen hervorrufen.

Die Rewrite-Direktiven beginnen mit der Zeile „RewriteEngine on“. Darauf folgen optionale RewriteCond-Weiterleitungskonditionen, abgeschlossen von einer oder mehreren RewriteRule-Weiterleitungsregel(n). Das Verhalten von Weiterleitungskonditionen und -regeln lässt sich durch als „Flags“ bezeichnete Optionen beeinflussen. Um einen 301 Redirect auszulösen, muss eine der Regeln die Flags L,R=301 enthalten:

RewriteEngine on
RewriteCond TestString CondPattern [flags]
RewriteRule URL_path Substitution [L,R=301]
apacheconf

Innerhalb von Weiterleitungsregeln und Konditionen besteht Zugriff auf zahlreiche Header- und Server-Variablen der Form %{HTTP_HOST}, %{REQUEST_URI} etc. Diese lassen sich durch Operatoren verknüpfen und mit Funktionen verarbeiten. Somit lässt sich so gut wie jeder gewünschte Redirect realisieren, auch wenn die Syntax nicht gerade intuitiv ist.

Schauen wir uns ein Beispiel für einen 301 Redirect mittels mod_rewrite an. Wir möchten für unsere Website Canonical URLs zur Vermeidung von Duplicate Content erzwingen. Das bedeutet, dass alle URLs mit HTTPS und WWW beginnen sollen, unabhängig davon, wie Besucher und Besucherinnen die Inhalte abrufen.

Wir definieren zwei Weiterleitungskonditionen, die wir durch das OR-Flag miteinander verknüpfen. Die erste Kondition testet, ob HTTPS ausgeschaltet ist, die zweite Kondition überprüft, ob der Domain das führende WWW fehlt. Über das NC-Flag schalten wir die Unterscheidung zwischen Groß- und Kleinschreibung ab. Ist eine der beiden Konditionen wahr, leiten wir per 301 Redirect auf die HTTPS-WWW Version der URL um. Dabei nutzen wir den regulären Ausdruck (.*), der jegliche URL aufgreift, und fügen diese mittels $1 hinter der Domain ein:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [L,R=301]
apacheconf

Welche Probleme und Gefahren beim Einsatz von 301 Redirects gibt es?

Weiterleitungen des Typs 301 Redirect gehören zu den Standardwerkzeugen der Webentwicklung und des SEO. Jedoch ist beim Einrichten Vorsicht geboten; wenn Redirects unsachgemäß eingesetzt werden, drohen ernsthafte Probleme. Der Server kann abstürzen oder die Seite büßt Suchmaschinen-Ranking ein.

Beschädigung der htaccess-Datei bei manueller Änderung

Die htaccess-Datei konfiguriert den Apache-Webserver auf Verzeichnis-Ebene. Selbst kleinste fehlerhafte Änderungen an der htaccess-Datei führen leicht zu einer nicht erreichbaren Website. Dann droht der berüchtigte Server-Fehler 500 oder der „White Screen of Death“ unter WordPress.

Am besten legt man vor einer Bearbeitung der htaccess-Datei eine Kopie an. Das geht von der Kommandozeile ganz einfach. Wir wechseln in das öffentliche Webverzeichnis der Site und nutzen den cp-Befehl:

cp -a .htaccess _htaccess
bash

Kommt es nach der Veränderung der htaccess-Datei zu Fehlern, stellen wir die ursprüngliche Version wieder her:

cp -a _htaccess .htaccess
bash

Verkettete Redirects und Redirect-Schleifen

Redirects sind nützlich, „kosten“ jedoch einen kompletten Request-Response-Zyklus. Kommen verkettete Redirects zum Einsatz, müssen Nutzende warten, was zu einer erhöhten Bounce-Rate führt. Auch Suchmaschinen bewerten Seiten ngeativ, die mehrfach in Folge weiterleiten. Als Faustregel gilt, dass maximal drei Redirects hintereinandergeschaltet werden dürfen.

Fatal sind Redirect-Schleifen, bei denen zwei Adressen endlos aufeinander weiterleiten. Für Nutzende wirkt sich das im Browser-Fehler ERR_TOO_MANY_REDIRECTS aus. Die gewünschte Ressource ist dann nicht zu erreichen. Generell sollte man neu eingerichtete Redirects mit cURL testen, um sicherzugehen, dass das gewünschte Ergebnis erzielt wird.

Versehentliches Cache-Poisoning bei Nutzung der 301-Weiterleitung

Eine inkorrekte Nutzung des 301 Redirects kann später Kopfschmerzen bereiten. Im Unterschied zu den temporären Weiterleitungen des Typs 302, 303 und 307 weist der 301 Redirect den Client an, die neue URL in Cache zu speichern. Möchte man später auf die Original-URL umstellen, kommt dieser Wunsch bei Clients nicht an; sie verbinden stattdessen beharrlich weiterhin mit der neuen URL. Zum Gegensteuern nutzt man temporäre Redirects oder setzt den Cache-Control-Header auf einen passenden Wert.

Wir setzen den Cache-Control-Header beim Definieren der Redirect 301 Regel in der htaccess-Datei auf eine Stunde. So ist sichergestellt, dass spätere Änderungen des Weiterleitungsziels bei allen Clients ankommen:

ExpiresActive on
ExpiresDefault "access plus 1 hour"
Redirect 301 / https://www.example.com/
apacheconf

Kommen komplexe Weiterleitungen mit Rewrite-Direktiven zum Einsatz, greifen wir zu einem Trick, um den Cache-Control-Header zu setzen. Wir definieren eine Umgebungsvariable limitcache als Teil der 301-Weiterleitungsregel. Im Anschluss setzen wir den Header, wobei wir die Umgebungsvariable als Kondition auslesen. So ist sichergestellt, dass beim Weiterleiten der korrekte Header gesetzt wird:

RewriteRule ^.* http://www.example.com/ [L,R=301,E=limitcache:1]
Header always set Cache-Control "max-age=3600" env=limitcache
apacheconf
Tipp

Sie sind einer 301-Weiterleitung gefolgt, und nun weigert sich der Browser, auf die ursprüngliche Adresse zuzugreifen? Hängen Sie einfach einen „Query String“ mit beliebigem Inhalt der Form ?foo=bar an die alte Adresse an und erzwingen Sie so, dass der Browser die URL lädt.