HTTP_HOST mit mod_rewrite verändern

Ich möchte heute einen mod_rewrite - Move veröffentlichen, den ich so im Internet (als ich ihn selber brauchte ... *gnaaahr* .. ;) ) nicht gefunden habe.

Erstmal: Worum geht's?
Ich hatte auf der Arbeit folgende Aufgabe: Einer unserer Kunden hat mehrere Domains. Unter jeder dieser Domains gibt es einen DNS-Eintrag für jeden Server des Kunden. Zum Beispiel: server1.domain1.de , server1.domain2.de , ... etc. In  Einträgen mit gleichem Servernamen (server1) ist immer dieselbe IP hinterlegt.

Nun tauchten teilweise doppelte Einträge bei Suchmaschinen auf, wodurch das Ranking negativ beeinflusst wird. Es gab zum Beispiel diese beiden (fiktiven) Hits auf denselben Suchausdruck: http://server1.domain1.de/gartenzubehoer.html und http://server1.domain2.de/gartenzubehoer.html. Das ist natürlich eher nicht erwünscht.

Die Aufgabe bestand nun also aus 3 Punkten:

  1. Es sollen alle Anfragen von allen Domains auf eine einzige Hauptdomain mit einem RedirectPermanent (301) umgeleitet werden.
  2. Es muss erreicht werden, das der Subdomain - Teil (server1) mit übernommen wird und der Hauptdomain vorangestellt wird.
  3. Der URI-Teil nach dem Hostteil (/gartenzubehoer.html) muss in der neuen URI auch wieder angehangen werden.

Nun bietet mod_rewrite es in RewriteRule - Anweisung aber irgendwie nur an, den Teil nach dem Hostteil zu verändern/zu übernehmen. Somit hätte ich nur die Möglichkeit auf einen einzigen Server umzuleiten.
Es gibt auch die RewriteCond - Anweisung. Hiermit kann man auch die Variable HTTP_HOST auf bestimmte Inhalte hin überprüfen, jedoch nicht verändern.

Wie bekommt man es nun hin die Anfrage wie beschrieben zu manipulieren?

Lösung: Man kann mit einem regulären Ausdruck Werte aus der RewriteCond - Anweisung in der RewriteRule - Anweisung wiederverwerten!
Es folgt das Beispiel für die beschriebene Anforderung:

RewriteEngine On
RewriteCond %{HTTP_HOST} \^(.*)\.domain.\.de\$ [NC]
RewriteRule \^(.*)\$ http://%1\.domain1\.de\$1 [R=301,L]

Das wars! Das fiese: RewriteCond Speichert seine Pattern in Variablen, die mit %N angesprochen werden und RewriteRule in Variablen, die mit \$N angesprochen werden! Mit diesem Wissen ist es eigentlich schon wieder ein Kinderspiel, wie man sieht.

Ich gehe die Zeilen schnell (!) durch:

Zeile 1: Aktiviert nur das mod_rewrite .

Zeile 2: RewriteCond ist eigentlich dazu da, um einen Request vor der Umformung zunächst mal durch verschiedene Prüfungen gehen zu lassen. Nur wenn alle RewriteCond Tests erfolgreich waren, wird die Manipulation durch RewriteRule vorgenommen. Hier dient uns die Anweisung jedoch dazu den HTTP_HOST auszulesen und in der Variable %1 zu speichern. Dieses wird durch die () erreicht (Siehe: Reguläre Ausdrücke). Die Option [NC] steht für "not casesensitive" und bewirkt, das es egal ist, ob jemand eine beliebige Kombination aus Groß- und Kleinschreibung in der URL verwendet.

Zeile 3: RewriteRule definiert nun wie genau die Anfrage manipuliert werden soll. der zweite Teil nimmt sich einfach alle Zeichen, die hinter dem Hostteil kommen und speichert sie in der Variablen \$1. Anschließend wird das Ziel definiert. Hier werden beide Variablen, %1 und \$1, wieder verwertet. Die Optionen [R=301,L] besagen nun, das es sich um eine Umleitung (Redirect) des Types 301 (permanent) handelt, und das dieses die letzte Regel sein soll, die angewendet wird (L).

Das ganze hat mich über 2 Stunden gekostet. Hab offenbar immer wieder übersehen, das es sich um zwei unterschiedliche Variablenregister bei %N und \$N handelt.
Ich hoffe das dieses jemandem diese Zeit spart ;)

Wie immer freue ich mich sehr über ein kurzes Feedback in Form eines Kommentars :)

Teilen per: TwitterEmail