301 redirects für URLs mit Parameter

Über htaccess und speziell über 301 Redirects ist vor allem im Zusammenhang mit Suchmaschinenoptimierung bereits viel geschrieben worden. In der Regel findet man für die meisten alltäglichen Problemstellungen auch eine passende Lösung.

Das Problem mit den Parametern

Im Verlauf einer Suchmaschinenoptimierung für ein Seite die auf Typo3 Basis erstellt wurde, stieß ich auf ein Problem, das im Zusammenhang mit Typo3 in vielen Fällen zu beobachten ist. Den URLs wurde beim Aufsetzen des Projektes keine Beachtung geschenkt und Extensions wie das sehr verbreitete RealURL oder CoolURI waren nicht im Einsatz. Die URLs sahen beispielsweise so aus: http://www.domain.de/index.php?id=66

Seiten wurden nicht anhand des Seitennamens (index.php oder produkte.php) aufgerufen und eindeutig gekennzeichnet, sondern über den Parameter (z.B. ?id=66 -> Startseite, ?id=produkte -> Produktübersicht).

Nach Installation und Konfiguration der RealURL Extension wurden zwar die URLs in “sprechende URLs” umgewandelt, jedoch waren die Seiten über die alten Adressen direkt oder über die Suchergebnisse in Google weiterhin aufrufbar. Um die so entstandene Duplicate-Content-Problematik zu beheben, mussten Weiterleitungen geschaffen werden, die Rücksicht auf die Parameter nehmen und die passende neue Seite aufrufen. Die Standard Weiterleitung in den meisten Erklärungen zum Thema 301 Redirects sieht vor, die Seiten z.B. wie folgt weiterzuleiten:

RewriteEngine on
Redirect 301 /index.php http://www.domain.de/produkte.php

oder das passendere Beispiel mit Parameter

RewriteRule ^index.php?id=(.*)$ /produkte.php [L,R=301]

In unserem Falle hätte dies jedoch lediglich dazu geführt, dass ALLE Seiten die gleiche Zieladresse nämlich http://www.domain.de/produkte.php aufgerufen hätten, unbeeindruck von dem für uns wichtigen ID-Parameter, der eine Zuordnung zu einer dezidierten Unterseite ermöglicht.

Die Lösung

Die Lösung für das Problem einen 301 Redirect für URLs mit Parameter zu schaffen, kann so aussehen:

RewriteCond %{query_STRING} ^id=166(.*)$
RewriteRule ^index\.php$ http://www.domain.de/produkte.php? [R=301,L]
  • RewriteCond definiert zunächst die Bedingung für eine Umleitung.
  • Die Variable $query_STRING enthält den Parameter, also den gesamten Teil nach dem ?-Zeichen, der definiert wird durch den Inhalt zwischen dem Start-String ^ und dem Ende-String, der durch $ markiert wird. In unserem Beispiel demnach id=166 und andere willkürliche Parameter oder Zeichenketten die noch folgen könnten mit Hilfe von (.*). Im Falle von Typo3 z.B. der Parameter “no_cache=1″. http://www.domain.de/index.php?id=66&no_cache=1
  • RewriteRule definiert die Umleitung, wenn die o.g. Bedingung erfüllt ist, nämlich eine URL mit dem Parameter id=66.
  • Start und Ende werden wieder über ^ und $ definiert und leiten dann die index.php an die gewünschte Adresse http://www.domain.de/produkte.php mit einem 301 Redirect weiter.

Sollte es wie in unserem Fall nicht nur Duplicate Content Probleme aufgrund von kryptischen URLs und sprechenden URLs geben, sondern auch der Fall auftreten, dass mehrer IDs auf die gleiche Seite führen, kann die Bedingung mit dem “|” als “Oder” erweitert werden. Im nachfolgenden Beispiel gilt also: Wenn die Bedingung id=lorem ODER id=165 usw. in der URL erfüllt ist, wende die RewriteRule an.

RewriteCond %{query_STRING} ^(id=lorem)|(id=165)|(id=219)|(id=ipsum)(.*)$
RewriteRule ^index\.php$ http://www.domain.de/lorem.html? [R=301,L]

Eine Adresse wie http://www.domain.de/?id=66 kann wie folgt redirected werden:

RewriteCond %{query_STRING} ^(id=66)(.*)$
RewriteRule ^$ http://www.domain.de/ipsum.html? [R=301,L]

Dass man sich viel Arbeit ersparen kann wenn man zum GoLive eine anständige URL-Struktur vorweisen kann wird spätestens hier klar. Soweit fürs Erste. Viel Spass beim Aufräumen…

3 Responses to “301 redirects für URLs mit Parameter”

  1. Erst einmal danke für den Beitrag! Das ist (fast) schon, was ich suche.

    Konkret geht es um diese Weiterleitung:

    RewriteCond %{query_STRING} ^id=166(.*)$
    RewriteRule ^index\.php$ http://www.domain.de/produkte.php? [R=301,L]

    Allerdings würde ich die index.php, abhängig von der id, auf jeweils statische URLs weiterleiten, also z.B. auf produkte.html.

    Nun hatte ich das mal mit der Weiterleitung versucht, das führte allerdings zu einem Fehler, da an das .html dann die id rangehängt wurde.

    Kann man das irgendwie verhindern?

    Vielen Dank schon mal für jedwede Hilfe!

  2. Hallo Alex, ich vermute mal dass Du das letzte “?” vor der eckigen Klammer in der RewriteRule vergessen hast.

Leave a Reply