Zum Inhalt springen

301-Weiterleitungen richtig schreiben

Redirect, RedirectMatch und RewriteRule im Vergleich: wann welche Direktive passt, wie Query-Strings erhalten bleiben und wie du Endlosschleifen und Sammelweiterleitungen vermeidest.

Zuletzt geprüft: Gedacht für: Relaunch und Domainumzug

Das Wichtigste

  • Redirect ist ein Präfix-Match und hängt den Restpfad ans Ziel an. RedirectMatch und RewriteRule arbeiten mit regulären Ausdrücken und tun das nicht.
  • Ein 301 gilt für Browser als dauerhaft und wird aggressiv gecacht. Zum Testen erst 302 nehmen, dann umstellen.
  • Viele Alt-URLs auf eine einzige Zielseite umzuleiten wertet Google als Soft-404. Ohne passendes Ziel ist ein 410 das ehrlichere Signal.
  • RewriteRule sieht den Query-String nicht. Dafür gibt es %{QUERY_STRING} und die Flags QSA beziehungsweise QSD.

Weiterleitungen sind der Teil eines Relaunches, an dem am meisten Sichtbarkeit verlorengeht. Nicht, weil die Technik schwierig wäre, sondern weil sie meist ungeprüft ausgeliefert wird.

Die drei Direktiven im Vergleich

DirektiveModulVergleichRestpfadQuery-String
Redirectmod_aliasPräfixwird angehängtbleibt erhalten
RedirectMatchmod_aliasRegExnur über Gruppenbleibt erhalten
RewriteRulemod_rewriteRegExnur über Gruppennur mit QSA

Das Anhängen des Restpfads bei Redirect wird regelmäßig übersehen:

Redirect 301 /alt/ https://example.com/neu/

Ein Aufruf von /alt/seite.htm landet damit auf /neu/seite.htm. Steht als Ziel eine tiefe URL, entsteht daraus /neu/unterseite/seite.htm und damit ein 404. Genau dieses Verhalten haben auch viele Registrar-Weiterleitungen: Sie hängen den Alt-Pfad ans Ziel an, was bei einer Root-Weiterleitung unsichtbar bleibt und jeden Deep-Link zerlegt.

Einzelne Seite umleiten

RewriteEngine On

# Exakt eine Alt-URL auf eine neue Seite
RewriteRule ^alte-seite\.htm$ /neuer-bereich/neue-seite/ [R=301,L]

Das ^ und das $ sind nicht optional. Ohne Anker matcht alte-seite\.htm auch /archiv/alte-seite.htm.bak.

Ganze Domain umziehen

RewriteCond %{HTTP_HOST} ^(www\.)?alte-domain\.de$ [NC]
RewriteRule ^(.*)$ https://neue-domain.de/$1 [R=301,L,NE]

Der $1 transportiert den Pfad mit. Fehlt er, laufen sämtliche Unterseiten auf der neuen Startseite auf. Das ist der klassische Sammel-301: Google wertet eine Viele-auf-Eine-Weiterleitung als Soft-404, nimmt die Alt-URL aus dem Index und überträgt die Relevanz nicht. Bei einem Portal mit gewachsener Linkstruktur ist der Unterschied in den Impressionen innerhalb weniger Wochen sichtbar.

Query-Strings behandeln

RewriteRule sieht nur den Pfad. Der Query-String wird separat geprüft:

# /index.php?id=42  ->  /produkte/laufschuhe/
RewriteCond %{QUERY_STRING} (^|&)id=42(&|$)
RewriteRule ^index\.php$ /produkte/laufschuhe/? [R=301,L]

Das Fragezeichen am Ende des Ziels löscht den ursprünglichen Query-String. Ohne es hängt Apache ihn an und du landest auf /produkte/laufschuhe/?id=42. Ab Apache 2.4 macht das Flag QSD dasselbe lesbarer, QSA hängt den alten String bewusst an.

Wenn es kein passendes Ziel gibt

Nicht jede Alt-URL verdient eine Weiterleitung. Ein gelöschtes Forum, eine private Fotogalerie oder ein eingestelltes Produkt haben kein thematisches Pendant. Dann ist 410 Gone das richtige Signal:

RedirectMatch 410 ^/forum/
RedirectMatch 410 ^/galerie/

Der Unterschied zu 404 ist die Absicht: 404 heißt “nicht gefunden, vielleicht kommt es wieder”, 410 heißt “bewusst entfernt”. Suchmaschinen nehmen 410-URLs schneller aus dem Index, und du vermeidest, dass ein Sammel-301 deine Startseite mit fremden Themen verknüpft.

Reihenfolge und Verschattung

Regeln werden von oben nach unten geprüft. Eine breite Altregel fängt deshalb alles ab, was darunter steht:

# FALSCH: die neue Seite ist nie erreichbar
RewriteRule ^produkte/ /shop/ [R=301,L]
RewriteRule ^produkte/neuheiten/$ /shop/neuheiten/ [R=301,L]

Die spezifischere Regel gehört nach oben. Beim Aufräumen einer gewachsenen .htaccess ist das der häufigste Fund: Eine Seite wurde neu angelegt, ist aber nicht erreichbar, weil eine drei Jahre alte Regel sie vorher wegfängt.

Vor dem Deploy testen

while read url; do
  printf '%-55s ' "$url"
  curl -sIo /dev/null -w '%{http_code} -> %{redirect_url}\n' "$url"
done < alt-urls.txt

Die Liste der Alt-URLs kommt aus dem Logfile, der Search Console oder einem Backlink-Export. Anschließend zählst du die Ziele aus: Laufen auffällig viele Alt-URLs auf derselben Seite zusammen, ist genau das der Befund, nicht das Ergebnis.

Häufige Fragen

Wann nehme ich Redirect und wann RewriteRule?

Redirect reicht für ganze Verzeichnisse, die eins zu eins umziehen. Sobald du Muster brauchst, Bedingungen prüfst oder den Query-String anfassen willst, ist RewriteRule richtig. Beide in derselben Datei zu mischen ist erlaubt, aber Redirect wird immer nach dem Rewrite-Block ausgewertet, was zu überraschenden Ergebnissen führt.

Wie leite ich eine komplette Domain um?

Mit einer einzigen RewriteRule, die den Pfad übernimmt: RewriteRule ^(.*)$ https://neue-domain.de/$1 [R=301,L,NE]. Wichtig ist der $1 am Ende - ohne ihn landen alle Unterseiten auf der Startseite, und das ist genau die Sammelweiterleitung, die Rankings kostet.

Wie prüfe ich, ob meine Weiterleitungen greifen?

Mit curl -sI gegen die Alt-URL. Interessant sind zwei Zeilen: der Statuscode und location. Teste die komplette Alt-URL-Liste, nicht nur die Startseite - der häufigste Fehler ist eine Regel, die die Root korrekt umleitet und jede Unterseite in ein 404 schickt.

Was ist der Unterschied zwischen 301 und 308?

Beide sind dauerhafte Weiterleitungen. Der 308 erzwingt zusätzlich, dass die Methode erhalten bleibt - ein POST bleibt ein POST. Suchmaschinen behandeln beide gleich. Manche Registrar-Weiterleitungen antworten mit 308, was jeden Test, der stur auf 301 prüft, fehlschlagen lässt.