Jan: RewriteEngine

Hi!

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

Ich muss dies mit der .htaccess machen.
Da es ziemlich viele Domains sind, will ich nicht für jede Domain eine eigene RewriteRule schreiben und versuche dies mittels einer logischen Abfrage:

1  RewriteEngine On
2  #Options +FollowSymlinks
3  #RewriteBase /
4  #### Damit Hauptdomain nicht umgeleitet wird:
5  RewriteCond %{HTTP_HOST}          !hauptdomain.de$ [NC]
6  #### Domainname ermitteln
7  RewriteCond %{HTTP_HOST}          ([^.]+).de$  [NC]
8  #### Hier ist das Problem: Abfrage, ob der Domainname schon in der URI steht
9  RewriteCond {REQUEST_URI}        !%1/
10 #### Seite umleiten
11 RewriteRule ^(.+)                 %{HTTP_HOST}/$1 [C]
12 RewriteRule ([^.]+).de(.*)       /$1$2 [L]

Problem ist, dass die Rewrite-Rule immer ausgeführt wird und Zeile 9 dies nicht abfängt.
Schreibe ich in Zeile 9 exakt die Domain, die ich eingebe, also beispielsweise
9  RewriteCond {REQUEST_URI}        !beispieldomain/
funktioniert das ganze.

Schreibe ich statt Zeile 8-12 einfach
RewriteRule ^(.*)$     /test/%1 [L]
so versucht er auf /test/beispieldomain zuzugreifen. Also scheint doch in %1 beispieldomain gespeichert zu sein. Warum funktioniert dann aber die Abfrage nicht!?!

Gruß

Jan

  1. Statt {REQUEST_URI} muss da natürlich %{REQUEST_URI} stehen (das ist aber nicht der Fehler).

  2. 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