Sönke Tesch: RewriteEngine

Beitrag lesen

Ich will meine C-Names alle (unsichtbar) umleiten in entsprechende Ordner. Beispielsweise www.beispieldomain.de in www.hauptdomain.de/beispieldomain/

8  #### Hier ist das Problem: Abfrage, ob der Domainname schon in der URI steht
9  RewriteCond %{REQUEST_URI}        !%1/

Mir hat das auch einige Fragezeichen in's Gesicht geschrieben, aber ein Blick in den Quellcode von mod_rewrite brachte schlussendlich Klarheit und nach einem weiteren Blick in die Anleitung hätte ich mir in den Hintern beißen können - da ist es nämlich ganz klar beschrieben ;)

Des Rätsels Lösung: %1 & Co. sind im Muster (!) von RewriteRule und RewriteCond nicht erlaubt bzw. werden nicht ersetzt, sie gelten nur im Vergleichstext. Das IMHO allerhöchst Hinterhältige an der Sache:

11 RewriteRule ^(.+)                 %{HTTP_HOST}/$1 [C]

Bei RewriteRule und RewriteCond sind die Positionen vertauscht, RewriteCond hat den Vergleichstext links stehen, RewriteRule rechts.
Deshalb funktioniert %{HTTP_HOST} bei RewriteRule in Zeile 11 an der rechten Stelle ganz wunderbar, während %1 an rechter Position bei RewriteCond in Zeile 9 "fehlschlägt".

Problem ist, dass die Rewrite-Rule immer ausgeführt wird und Zeile 9 dies nicht abfängt.

..was dann auch kein Wunder ist: Solange Du keine URI hast, die exakt den Text "%1/" beinhaltet, schlägt Zeile 9 nicht an.

Schreibe ich in Zeile 9 exakt die Domain, die ich eingebe, also beispielsweise
9  RewriteCond {REQUEST_URI}        !beispieldomain/
funktioniert das ganze.

Logisch.

Schreibe ich statt Zeile 8-12 einfach
RewriteRule ^(.*)$     /test/%1 [L]

Ebenfalls klar, %1 funktioniert bei RewriteRule _rechts_.

Erstmal schönen Dank für diese Frage, ein wenig Gehirnjogging tut immer gut :)

Dein Problem wirst Du anders lösen müssen, denn wenn Du HTTP_HOST nicht in das Muster aufnehmen kannst, kannst Du auch nichts gegen HTTP_HOST prüfen. Du könntest das umgehen, indem Du vielleicht prüfst, ob die gewünschte Adresse mit einer Domain beginnt, etwa so:

# Entspricht oberstes Verzeichnis der URI nicht dem Format abc.abc?
  RewriteCond  %{REQUEST_URI} !^/[a-z.]+/
  # mögliches "www." vom Anfang des Hostnamens abschneiden
  RewriteCond  %{HTTP_HOST}   ^(www.)?(.*)
  # gefilterten Hostnamen vor Pfad setzen
  RewriteRule  (.*) /%2/$1

Hab's nicht probiert, aber so in der Art könnte es funktionieren.

Gruß,
  soenk.e