301 redirects für URLs mit Parameter

Dezember 31st, 2009 § 10 comments

Ü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 in den URLs

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…

§ 10 Responses to 301 redirects für URLs mit Parameter"

  • [...] meisten alltäglichen Problemstellungen auch eine passende Lösung. kompletter Artikel hier: http://www.lightseeker.de/seo/301-redirects-fuer-urls-mit-parameter/ Bookmark meinen [...]

  • Alex sagt:

    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!

  • r:r sagt:

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

  • sascha sagt:

    Super! Danke für diesen Beitrag. Habe genau das beschriebe Problem gehabt und konnte es nun lösen!

  • Jonas sagt:

    Ich habe das umgekehrte Problem. Und zwar suche ich nach einer Lösung, wie ich eine Sprechende URL z.B: http://www.domain.de/produkt123.php an eine parameterisierte weiterleiten kann, z.B. http://www.domain.de/index.aspx?content=produkt_123 aber die originäre URL weiterhin in den SERP’s angezeigt wird. Eine JavaScript Weiterleitung in Verbindung mit dem Cannonical-Tag zur Vermeidung von Duplicate Content funktioniert momentan gut, allerdings ist es streng genommen Cloaking und daher eine eher suboptimale Lösung.

    Hat jemand eine Idee wie man das sauber lösen kann?

  • r:r sagt:

    Wäre es nicht am einfachsten per URL_rewrite deine parametrisierte URL wieder in etwas lesbares umzuwandeln bzw. zurück auf deine alte Wunsch-URL umzuschreiben. Einen Ansatz dafür findest Du z.B. hier: http://www.modrewrite.de/mod-rewrite/beispiele/statische-url/

  • Peter sagt:

    Prima, genau was ich gesuchte habe.
    Danke

  • Frieder sagt:

    Erst mal danke für die klasse Anleitung! Hat mich echt weitergebracht!
    Allerdings bin ich noch über zwei Probleme bei meiner Seite gestoßen:

    1. Wenn ich zwei Seiten mit id=3 und id=33 habe und für beide eine 301 Weiterleitung einrichte, greift immer nur die Weiterleitung mit id=3. Hier sollte meiner Meinung nach im RegExp noch ein & stehen, damit er den ganzen String bis zum nächsten Parameter vergleicht.

    ^id=166(.*)$ –> ^id=166(&.*)$

    2. Wie kann ich denn weitere Parameter z.B. “index.php?id=3&Param1=1&Param2=2″ der Static-Seite übergeben? Hierfür habe ich noch keine Lösung gefunden.

    Kannst du mit da vielleicht weiterhelfen? Danke schon mal!!!

    Gruß,
    Freider

  • Frieder sagt:

    Sorry, noch ein kleiner Nachtrag:

    Damit zusätzliche Parameter nicht vorkommen müssen:

    ^id=38(&.*)*$

What's this?

You are currently reading 301 redirects für URLs mit Parameter at Lightseeker.

meta