Der Begriff 301 Redirect be­zeich­net eine per­ma­nen­te Wei­ter­lei­tung einer Web­adres­se auf eine andere. Wir erklären die tech­ni­schen Hin­ter­grün­de und zeigen, wie man den Redirect 301 mit der htaccess-Datei auf dem Server ein­rich­tet.

Wofür werden 301 Redirects benötigt?

Beim 301 Redirect handelt es sich um die be­kann­tes­te Art der Wei­ter­lei­tung. Dabei bezieht sich die Zahl 301 auf den zu Grunde liegenden HTTP-Status-Code. Während der Status-Code 404 anzeigt, dass die an­ge­for­der­te Ressource nicht gefunden werden kann, be­zeich­nen die 300er-Codes Redirects, zu Deutsch „Wei­ter­lei­tun­gen“. Generell dienen 301 Redirects dazu, 404-Fehler zu ver­hin­dern.

Wir geben eine Übersicht der wich­tigs­ten HTTP-Status-Codes im Zu­sam­men­hang mit Wei­ter­lei­tun­gen:

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

301-Wei­ter­lei­tung zum Migrieren von Inhalten

Web­in­hal­te, auch als Res­sour­cen bekannt, sind unter Web­adres­sen verortet. Manchmal werden Inhalte migriert, d. h. der Inhalt bleibt gleich, doch die Adresse ändert sich. Das ist u. a. der Fall bei der Um­stel­lung von HTTP auf HTTPS, beim Umzug einer Site auf eine neue Domain oder einer Anpassung der Link­struk­tur für Such­ma­schi­nen­op­ti­mie­rung. In allen Fällen möchte man vermeiden, dass Nutzer und Nut­ze­rin­nen, die auf be­stehen­de 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 ge­wünsch­te Ressource möglich ist. Wird die Adresse statt von einem Menschen von einem Web­craw­ler auf­ge­ru­fen, führen 404-Fehler zum De-In­di­zie­ren der zu­ge­hö­ri­gen Ressource. Beide Szenarien versuchen Website-Be­trei­ben­de tunlichst zu vermeiden.

301-Wei­ter­lei­tun­gen für Such­ma­schi­nen­op­ti­mie­rung

Außer für Adress­än­de­run­gen von Web­in­hal­ten sind 301-Wei­ter­lei­tun­gen es­sen­zi­ell für die Such­ma­schi­nen­op­ti­mie­rung (SEO) und das On­line­mar­ke­ting. So kommen 301-Wei­ter­lei­tun­gen zum Erzeugen der für SEO be­deut­sa­men „Pretty URLs“ und „Canonical URLs“ zum Einsatz. Auch die zum Ver­brei­ten von Landing­pa­ges auf Social Media beliebten URL-Shortener setzen intern auf Redirects des Typs 301.

Warum sind 301-Wei­ter­lei­tun­gen nun so wichtig für SEO? Anders als bei den ver­wand­ten Wei­ter­lei­tun­gen 302, 303 und 307 wird nur beim 301 Redirect der „Link Juice“ der ur­sprüng­li­chen Adresse auf die neue Adresse über­tra­gen. Hat eine Such­ma­schi­ne einen Inhalt indiziert und als positiv bewertet, lässt sich die Adresse per 301-Wei­ter­lei­tung neu setzen, ohne dass die Bewertung verloren ginge. So machen 301 Redirects komplexe SEO-Stra­te­gien wie die Multiple-Domain-Strategie erst möglich.

Wie funk­tio­nie­ren 301 Redirects?

301-Wei­ter­lei­tun­gen kommen beim Austausch zwischen Web­ser­vern und Clients zum Tragen. Der Server zeigt dem Client an, dass die ge­wünsch­te Ressource unter der ab­ge­frag­ten Web­adres­se (URL) nicht mehr verfügbar ist und übergibt die nunmehr gültige Adresse. Beim Client kann es sich sowohl um den Browser eines mensch­li­chen Nutzers bzw. einer Nutzerin als auch um einen Such­ma­schi­nen-Bot handeln.

  1. Der Client versucht, auf die Ressource unter der URL zu­zu­grei­fen.
  2. Der Server antwortet mit Status-Code 301 „Moved Per­ma­nent­ly“ 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; zu­künf­ti­ge 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 ver­an­schau­li­chen. Wir rufen die IONOS-Homepage unter "http://ionos.de" auf und nutzen die Option --head, um den HTTP-Response-Header aus­zu­ge­ben:

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

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

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

Nun gibt cURL die Header zweier Ver­bin­dun­gen aus. Beim zweiten Aufruf antwortet der Server mit Status-Code „200 OK“; die Ressource wurde gefunden, der Inhalt wird im Response-Body über­mit­telt. Derselbe Prozess läuft im Hin­ter­grund in Ihrem Browser ab, wenn Sie die Adresse dort eingeben.

Redirect 301 per htaccess-Datei de­fi­nie­ren

Wir haben gesehen, welche Rolle 301-Wei­ter­lei­tun­gen beim Austausch zwischen Server und Client spielen. Doch wie lassen sich auf dem Server 301 Redirects festlegen? Dazu gibt es ver­schie­de­ne Ansätze; einer der am häu­figs­ten ein­ge­setz­ten besteht darin, Wei­ter­lei­tungs­di­rek­ti­ven in der htaccess-Datei des Apache-Web­ser­vers zu de­fi­nie­ren. Damit das funk­tio­niert, müssen die ent­spre­chen­den Apache-Module aktiv sein:

Di­rek­ti­ven Apache-Modul Erklärung
Redirect mod_alias Einfache Wei­ter­lei­tun­gen
Rewrite mod_rewrite Komplexe Wei­ter­lei­tun­gen

Einfache Redirects für 301-Wei­ter­lei­tung in htaccess-Datei

Schauen wir uns zunächst an, wie sich einfache Redirects vom Typ 301 in der htaccess-Datei de­fi­nie­ren lassen. Wir nutzen dazu die Redirect-Di­rek­ti­ven des Moduls mod_alias. Diese eignen sich, wenn es darum geht, eine URL auf dem Server zu einer anderen URL wei­ter­zu­lei­ten. Das Muster ist ganz einfach:

Redirect 301 "/source_path" "target_URL"
apach­econf

Leiten wir zunächst eine URL auf dem Server zu einer anderen internen URL um. Der Schräg­strich am Anfang be­zeich­net den Anfang des URL-Pfads, also den Teil nach der Domain:

Redirect 301 "/old.html" "/new.html"
apach­econf

Möchten wir statt­des­sen auf eine externe URL verweisen, notieren wir diese als Ziel:

Redirect 301 "/old.html" "http://example.com/new.html"
apach­econf

Per Redirect-Direktive lassen sich auch 301-Wei­ter­lei­tun­gen ganzer Ver­zeich­nis­se in der htaccess-Datei de­fi­nie­ren. Wir leiten alle URLs, die mit der Pfad-Kom­po­nen­te „de“ beginnen, auf eine Subdomain um:

Redirect 301 "/de/" "http://de.example.com/"
apach­econf

Nach demselben Schema lassen sich alle URLs einer Domain auf eine andere Domain wei­ter­lei­ten:

Redirect 301 "/" "http://other.example.com/"
apach­econf

Möchte man viele einzelne Adressen umleiten, die einem gewissen Muster folgen, wird das Notieren einzelner Redirects schnell um­ständ­lich. Dann greift man zur ver­wand­ten Re­di­rect­Match-Direktive. Diese nutzt einen regulären Ausdruck, um Muster zu erkennen und Teile davon zu ex­tra­hie­ren:

RedirectMatch 301 regex URL
apach­econf

Wir zeigen hier ex­em­pla­risch einen Re­di­rect­Match-Eintrag, der Kategorie und ID eines Artikels aus den GET-Pa­ra­me­tern ex­tra­hiert und in den Pfad um­schreibt:

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

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

Komplexe Redirects für 301-Wei­ter­lei­tung in htaccess-Datei

Zum Erstellen von 301-Wei­ter­lei­tun­gen für komplexe An­wen­dungs­fäl­le nutzt man die Rewrite-Di­rek­ti­ven des Apache-Um­lei­tungs­mo­duls mod_rewrite. Damit lassen sich Wei­ter­lei­tungs­kon­di­tio­nen de­fi­nie­ren und abfragen, Um­ge­bungs­va­ria­blen setzen und auslesen und Wei­ter­lei­tungs­re­geln mit regulären Aus­drü­cken de­fi­nie­ren.

Mit mod_rewrite ist es möglich, Wei­ter­lei­tungs­re­geln zu verketten; das Modul liefert quasi eine Mini-Pro­gram­mier­spra­che zum Umformen von URLs und Auslösen von Redirects. Dabei ist Vorsicht geboten, denn ein feh­ler­haf­ter Einsatz kann End­los­schlei­fen her­vor­ru­fen.

Die Rewrite-Di­rek­ti­ven beginnen mit der Zeile „Re­wri­teEn­gi­ne on“. Darauf folgen optionale Re­wri­te­Cond-Wei­ter­lei­tungs­kon­di­tio­nen, ab­ge­schlos­sen von einer oder mehreren Re­wri­te­Rule-Wei­ter­lei­tungs­re­gel(n). Das Verhalten von Wei­ter­lei­tungs­kon­di­tio­nen und -regeln lässt sich durch als „Flags“ be­zeich­ne­te Optionen be­ein­flus­sen. Um einen 301 Redirect aus­zu­lö­sen, muss eine der Regeln die Flags L,R=301 enthalten:

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

Innerhalb von Wei­ter­lei­tungs­re­geln und Kon­di­tio­nen besteht Zugriff auf zahl­rei­che Header- und Server-Variablen der Form %{HTTP_HOST}, %{REQUEST_URI} etc. Diese lassen sich durch Ope­ra­to­ren ver­knüp­fen und mit Funk­tio­nen ver­ar­bei­ten. Somit lässt sich so gut wie jeder ge­wünsch­te Redirect rea­li­sie­ren, 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 Ver­mei­dung von Duplicate Content erzwingen. Das bedeutet, dass alle URLs mit HTTPS und WWW beginnen sollen, un­ab­hän­gig davon, wie Besucher und Be­su­che­rin­nen die Inhalte abrufen.

Wir de­fi­nie­ren zwei Wei­ter­lei­tungs­kon­di­tio­nen, die wir durch das OR-Flag mit­ein­an­der ver­knüp­fen. Die erste Kondition testet, ob HTTPS aus­ge­schal­tet ist, die zweite Kondition überprüft, ob der Domain das führende WWW fehlt. Über das NC-Flag schalten wir die Un­ter­schei­dung zwischen Groß- und Klein­schrei­bung ab. Ist eine der beiden Kon­di­tio­nen 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]
apach­econf

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

Wei­ter­lei­tun­gen des Typs 301 Redirect gehören zu den Stan­dard­werk­zeu­gen der Web­ent­wick­lung und des SEO. Jedoch ist beim Ein­rich­ten Vorsicht geboten; wenn Redirects un­sach­ge­mäß ein­ge­setzt werden, drohen ernst­haf­te Probleme. Der Server kann abstürzen oder die Seite büßt Such­ma­schi­nen-Ranking ein.

Be­schä­di­gung der htaccess-Datei bei manueller Änderung

Die htaccess-Datei kon­fi­gu­riert den Apache-Webserver auf Ver­zeich­nis-Ebene. Selbst kleinste feh­ler­haf­te Än­de­run­gen an der htaccess-Datei führen leicht zu einer nicht er­reich­ba­ren Website. Dann droht der be­rüch­tig­te Server-Fehler 500 oder der „White Screen of Death“ unter WordPress.

Am besten legt man vor einer Be­ar­bei­tung der htaccess-Datei eine Kopie an. Das geht von der Kom­man­do­zei­le ganz einfach. Wir wechseln in das öf­fent­li­che Web­ver­zeich­nis der Site und nutzen den cp-Befehl:

cp -a .htaccess _htaccess
bash

Kommt es nach der Ver­än­de­rung der htaccess-Datei zu Fehlern, stellen wir die ur­sprüng­li­che Version wieder her:

cp -a _htaccess .htaccess
bash

Ver­ket­te­te Redirects und Redirect-Schleifen

Redirects sind nützlich, „kosten“ jedoch einen kom­plet­ten Request-Response-Zyklus. Kommen ver­ket­te­te Redirects zum Einsatz, müssen Nutzende warten, was zu einer erhöhten Bounce-Rate führt. Auch Such­ma­schi­nen bewerten Seiten ngeativ, die mehrfach in Folge wei­ter­lei­ten. Als Faust­re­gel gilt, dass maximal drei Redirects hin­ter­ein­an­der­ge­schal­tet werden dürfen.

Fatal sind Redirect-Schleifen, bei denen zwei Adressen endlos auf­ein­an­der wei­ter­lei­ten. Für Nutzende wirkt sich das im Browser-Fehler ERR_TOO_MANY_REDIRECTS aus. Die ge­wünsch­te Ressource ist dann nicht zu erreichen. Generell sollte man neu ein­ge­rich­te­te Redirects mit cURL testen, um si­cher­zu­ge­hen, dass das ge­wünsch­te Ergebnis erzielt wird.

Ver­se­hent­li­ches Cache-Poisoning bei Nutzung der 301-Wei­ter­lei­tung

Eine in­kor­rek­te Nutzung des 301 Redirects kann später Kopf­schmer­zen bereiten. Im Un­ter­schied zu den tem­po­rä­ren Wei­ter­lei­tun­gen 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 statt­des­sen be­harr­lich weiterhin mit der neuen URL. Zum Ge­gen­steu­ern nutzt man temporäre Redirects oder setzt den Cache-Control-Header auf einen passenden Wert.

Wir setzen den Cache-Control-Header beim De­fi­nie­ren der Redirect 301 Regel in der htaccess-Datei auf eine Stunde. So ist si­cher­ge­stellt, dass spätere Än­de­run­gen des Wei­ter­lei­tungs­ziels bei allen Clients ankommen:

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

Kommen komplexe Wei­ter­lei­tun­gen mit Rewrite-Di­rek­ti­ven zum Einsatz, greifen wir zu einem Trick, um den Cache-Control-Header zu setzen. Wir de­fi­nie­ren eine Um­ge­bungs­va­ria­ble li­mit­cache als Teil der 301-Wei­ter­lei­tungs­re­gel. Im Anschluss setzen wir den Header, wobei wir die Um­ge­bungs­va­ria­ble als Kondition auslesen. So ist si­cher­ge­stellt, dass beim Wei­ter­lei­ten 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
apach­econf
Tipp

Sie sind einer 301-Wei­ter­lei­tung gefolgt, und nun weigert sich der Browser, auf die ur­sprüng­li­che Adresse zu­zu­grei­fen? Hängen Sie einfach einen „Query String“ mit be­lie­bi­gem Inhalt der Form ?foo=bar an die alte Adresse an und erzwingen Sie so, dass der Browser die URL lädt.

Zum Hauptmenü