dodo-r
Goto Top

Redirect - Ausnahme definieren in Htaccess

Hallo!
Ich habe eine Frage zur Umleitung auf eine andere Domain mit Ausnahme bestimmter Verzeichnisse.
Das Thema wurde bereits in einem anderen Beitrag behandelt. Nun habe ich eine Frage dazu:
Der folgende Code sollte alle Anfragen außer bestimmte Verzeichnisse auf eine andere Domain umleiten.

RewriteEngine On
RewriteCond %{REQUEST_URI} "!^/(2001|2002)(/.*)?$" [NC,OR]  
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteRule .* http://www.domain2.at [L,R=301]

Allerdings werden hier die Verzeichnisse auch umgeleitet.

Nun meine Frage was passt hier nicht?

Wenn ich
RewriteCond %{REQUEST_URI} "!^(2001|2002)/?" [NC,OR]  
durch
RewriteCond %{REQUEST_URI} !^/(2001|2002)(/.*)?
ersetze funktioniert die Außnahmenregelung, aber ist dieser Code auch korrekt.
Habe leider zu wenig Erfahrung damit.
lg
dodo-r

Content-Key: 321255

Url: https://administrator.de/contentid/321255

Printed on: April 19, 2024 at 13:04 o'clock

Member: Arano
Arano Nov 17, 2016 at 18:45:38 (UTC)
Goto Top
Hallo

Allerdings werden hier die Verzeichnisse auch umgeleitet.
Welche denn ? Die ausgenommenen (2001 und 2002) ? Die die nicht existieren (!-d) ? Oder welche ?

Nun meine Frage was passt hier nicht?
1. Deine Schilderung allgemein
2. Möglicherweise die Anführungszeichen der ersten Condition Wo kommt diese Version eigentlich her ?
3. Das Fehlen von [NC,OR] der zweiten Condition.

[NC,OR] deren Bedeutung kann man eigentlich schnell in Erfahrung bringen:
NC = No Case / Groß-/Kleinschreibung nicht unterscheiden
OR = Oder / Verknüpft die Condiotion. In deinem Fall muss also eine der drei Condition zutreffen damit der Rewrite erfolgt.
Diesen Teil zu löschen verursacht hier also nur noch mehr Probleme als welche zu lösen.

Die zweite Condition sollte eigentlich schon passen, nur das hier mindestens das OR fehlt. Das NC kann hier wegfallen weil die Verzeichnisnamen aus Ziffern bestehen. Das OR jedoch ist erforderlich weil du ja möchtest, das mindestens eine dieser Condition zutreffen muss. OHNE das OR müsste es eine AND Verknüpfung sein (OR ist aber mächtiger): Die erste Cond und eine der beiden folgenden MÜSSEN zutreffen. A&( B|C )

Eine "Mischung" aus beiden sollte funktionieren:
UNGETESTET
RewriteCond %{REQUEST_URI} !^/(2001|2002)(/.*)?$ [NC,OR]
Das Dollar-Sign am Ende kann man glaube ich weglassen weil der * sich gierig verhält. Schaden sollte es aber auch nicht

%{REQUEST_URI sollte den gesamten Teil nach der Domain zurückliefern:
https://administrator.de/user/arano/

%{HTTP_HOST} = www.administrator.de
%{REQUEST_URI} = /user/arano/


~Arano
Member: dodo-r
dodo-r Nov 18, 2016 at 04:52:11 (UTC)
Goto Top
Hallo, guten Morgen!
Vielen Dank für deine ausführliche Antwort face-smile
Ich habe jetzt folgenden Code getestet, allerdings ohne Erfolg - es wird alles weitergeleitet auf die Domain2...

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/(2001|2002)(/.*)?$ [NC,OR] 
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteRule .* http://www.domain2.at [L,R=301]

Es werden die Verzeichnisse 2001 und 2002 auch immer umgeleitet.
lg
dodo-r
Member: Arano
Arano Nov 18, 2016 at 14:21:15 (UTC)
Goto Top
Hey,

Ich hatte ja gerade jemanden drauf hingewiesen das ein Problembeschreibung besser ausführlich zu schrieben ist: Was ist das Ziel, Wie soll das erreicht werden, Wann passiert der Fehler, Was ist der Fehler, Was sollte statt dessen passieren usw. und sofort.
Jetzt kann ich mir an die eigene Nase fassen -.-
All das seht hier nur Teilweise oder gar nicht.

Ausgehend von deiner Fragestellung im vorherigem Beitrag: Weiterleitung Redirect Htaccess - Ausnahme Ist die Lösung falsch !
In deiner Initialfrage erwähnst du ZWEI Zieladressen, deine Lösung enthält aber nur EINE... (2==1)=FALSE, hier kann doch also etwas nicht stimmen.

Und ja, meine Antwort von Gestern ist auch Grütze.

Da du eigentlich auf 2 URL (bedingt) weiterleiten möchtest, benötigst du auch zwei Rules.
RewriteCond %{REQUEST_URI} !^/(2001|2002)(/.*)?$ [NC]
RewriteRule ^(.*)$ http://arano/$1  [R=301,C]

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI} !-f
RewriteRule ^(.*)$ http://arano [R=301,L]
Achtung, Rule 1 ist mit 2 verkettet [C=Chain/Kette]

Alles was nicht mit 2001|2002 beginnt wird "normal" auf http://arano/... umgeleitet.
Durch [C] wird aber zusätzlich auch die folgende Rule getestet und falls die REQUEST_URI weder ein lokales Verzeichnis ist, noch eine lokale Datei dann wird nochmal weitergeleitet aber nur auf die Hauptdomain: http://arano.

local/index.php
local/test.html
local/2001/test.html
local/2002/test.html
local/2003/test.html
! Die Datei "404.html" existiert in keinem Fall !
Test-URL Target-URL
http://local/ http://arano/
http://local/2001 http://local/2001/
http://local/2002 http://local/2002/
http://local/2002/test.html http://local/2002/test.html
http://local/2002/404.html http://local/2002/404.html
http://local/2003 http://arano/2003/
http://local/2003/test.html http://arano/2003/test.html
http://local/2003/404.html http://arano/
http://local/2004 http://arano/
http://local/2004/404.html http://arano/
http://local/test.html http://arano/test.html
http://local/404.html http://arano/


Bzgl. der doppelten Anführungszeichen:
Im Apache Wiki und der Doku sind alle Parameter tatsächlich in dopl.Anführungszeichen.
Bei so ziemlich allen Beispielen dich in noch gesucht habe werden die nicht verwendet - darum kam mir das wohl auch so komisch vor.
Jedenfalls funktioniert das hier in beiden Fällen und als gemischte Variante.


~Arano