RewriteEngine
Jan
- webserver
0 Jan0 Sönke Tesch
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
Statt {REQUEST_URI} muss da natürlich %{REQUEST_URI} stehen (das ist aber nicht der Fehler).
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