Zur Navigation

.htaccess RewriteCond dynamisch machen?

1 SebastianJu

Hallo,

in meiner .htaccess will ich zwei Probleme angehen. Einmal dass alle Domains die auf dem Web liegen ohne www aufgerufen werden. Mit www also auf die domain ohne www umgeleitet wird. Das habe ich wohl auch bereits so:

RewriteCond %{HTTP_HOST} ^www\.([a-z0-9-]+\.[a-z]{2,})$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Als zweites will ich dass alle Domains die auf dem Web liegen ihre Dateien nicht direkt im Root lesen sondern jeweils auf ein Unterverzeichnis gleichen Namens geleitet werden.

Das klappt im Prinzip auch schon. Nur es ist noch nicht komplett dynamisch. Ich müsste bei meiner jetzigen Version für jede Domain eine neue Zeile einfügen.

RewriteCond %{HTTP_HOST} ([a-z0-9-]+\.[a-z]{2,})$ [NC]
RewriteCond %{REQUEST_URI} !domain1\.info [NC]
RewriteRule ^(.*)$ %1/$1

Also wie gesagt so klappt das bereits aber ich hätte gern dass in der mittleren cond die Domain dynamisch ist. Ich habe es mit %1 versucht aber scheinbar funktioniert das in conds nicht.

Gibts da eine Möglichkeit?

19.04.2010 13:31

2 Jörg Kruse

Im Normalfall kann man (rechts) im Pattern der RewriteCond auf keien Backreference zugreifen. Auf Servern mit neuerer POSIX-Version ist aber eine "atomic back-reference" möglich, die man sich hier vielleicht zunutzen machen kann - eine RewriteCond könnte dann so ausschauen:

RewriteCond %{HTTP_HOST}<>%{REQUEST_URI} ^(.+)<>.*\1.*$

Hierbei wird überprüft, ob HTTP_HOST in REQUEST_URI enthalten ist

19.04.2010 18:28

3 SebastianJu

Danke für den Tip. Allerdings scheint das so bei mir nicht zu klappen. Ich habe eine der mittleren Befehle auskommentiert und diese Zeile stattdessen genommen. Allerdings gab es dann einen Serverfehler. Könnte sein dass der Befehl nicht erkannt wird und daher unendlich oft neu weitergeleitet wird.

Ich hatte versucht ob es vielleicht an einem abschließenden / liegen könnte und

RewriteCond %{HTTP_HOST}<>%{REQUEST_URI} ^(.+)\/?<>.*\1.*$

benutzt aber dadurch bin ich im Hauptverzeichnis gelandet. Also nicht im Unterverzeichnis.

Es sind noch zwei andere Probleme aufgetreten mit dieser Konfiguration. Also mit der bisherigen die großteils funktioniert.

Ich hatte ein Programm benutzt um einen Feed zu erzeugen. Das Programm hat dann die Pfade ausgelesen und jeweils aus den einzelnen Seiten einen Feed gebaut.
Die Hauptseite im Feed war normal. Also domain.com. Die Unterseite, welche in einem Unterverzeichnis lag war es aber nicht. Der Pfad der drinstand war

domain.com/domain.com/IrgendeinUnterverzeichnis

Also offenbar hat er irgendwie das falsch eingelesen. Und der Link läuft natürlich auf die Art ins Leere.

Daher die erste Frage ob es einen Weg gibt so etwas zu verhindern. Also wenn so ein Pfad ankommt dort dieses falsche Verzeichnis zu entfernen.

In dem Zusammenhang eine Zwischenfrage. Ich verstehe bisher noch nicht was den Unterschied macht ob in einer .htaccess eine Veränderung des Pfades sichtbar in der URL-Leiste erfolgt oder ob diese unsichtbar ist.

Das zweite Problem war dass ich meinen Feed genau so genannt hatte wie die domain. Also

domain.com.xml

Das gab natürlich Probleme. Weil die mittlere Condition auf den Domainnamen prüfte gab es keine Weiterleitung ins Unterzeichnis. Deshalb die Frage ob man in

RewriteCond %{REQUEST_URI} !domain\.org [NC]

noch irgendwie festlegen kann dass die condition nicht erfüllt ist wenn hinter dem tld noch ".xml" steht?

21.04.2010 21:52

4 Jörg Kruse

Danke für den Tip. Allerdings scheint das so bei mir nicht zu klappen. Ich habe eine der mittleren Befehle auskommentiert und diese Zeile stattdessen genommen. Allerdings gab es dann einen Serverfehler. Könnte sein dass der Befehl nicht erkannt wird und daher unendlich oft neu weitergeleitet wird.

Ja, möglivcherweise kennt das System die "atomic back-reference" dann nicht (genauers könnte der error.log des Servers verraten, falls du darauf Zugriff hast)

Ich hatte versucht ob es vielleicht an einem abschließenden / liegen könnte und

RewriteCond %{HTTP_HOST}<>%{REQUEST_URI} ^(.+)\/?<>.*\1.*$

Ein Host hat keinen abschließenden "/" - der gehört schon zum Dateipfad

Ich hatte ein Programm benutzt um einen Feed zu erzeugen. Das Programm hat dann die Pfade ausgelesen und jeweils aus den einzelnen Seiten einen Feed gebaut.
Die Hauptseite im Feed war normal. Also domain.com. Die Unterseite, welche in einem Unterverzeichnis lag war es aber nicht. Der Pfad der drinstand war

domain.com/domain.com/IrgendeinUnterverzeichnis

Also offenbar hat er irgendwie das falsch eingelesen. Und der Link läuft natürlich auf die Art ins Leere.

Daher die erste Frage ob es einen Weg gibt so etwas zu verhindern. Also wenn so ein Pfad ankommt dort dieses falsche Verzeichnis zu entfernen.

Das häng von dem Programm ab, welches diesen Feed erstellt. Wie liest es denn die Seiten aus, über das Filesystem oder über die Verlinkung? ich würde mich da gegebenenfalls an den Programmierer des Tools wenden oder ein anderes Tool probieren.

Das zweite Problem war dass ich meinen Feed genau so genannt hatte wie die domain. Also

domain.com.xml

Das gab natürlich Probleme. Weil die mittlere Condition auf den Domainnamen prüfte gab es keine Weiterleitung ins Unterzeichnis. Deshalb die Frage ob man in

RewriteCond %{REQUEST_URI} !domain\.org [NC]

noch irgendwie festlegen kann dass die condition nicht erfüllt ist wenn hinter dem tld noch ".xml" steht?

Ich würde in der Bedingung noch einen Slash dranhängen:

RewriteCond %{REQUEST_URI} !domain\.org/ [NC]

21.04.2010 22:49

5 SebastianJu

Danke. Das hat geklappt...

30.04.2010 19:25

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]