Doppelter Mod_rewrite
derda
- webserver
Hallo Forum,
ich habe ein Problem mit dem mod_rewrite des Apache Servers. Und zwar habe ich eine Homepage auf der ein paar tausend Dateien liegen die alle im Format abc_def.php sind wobei "abc" und "def" jeweils ein beliebiger String sind. Nun soll folgenes geschehen:
1. Alle Anfragen an *_*.php sollen per 301 auf *-*.php weitergeleitet werden (also aus Unterstrich mach Minus).
2. Da wir wegen des CMS nicht alle tausend Dateien umbenennen können müssen die Dateinamen weiterhin aber *_*.php bleiben. Es muss also eine zweite RewriteRule genau das Gegenteil von der ersten machen: Nämlich alle Anfragen die an *-*.php gehen intern auf *_*.php umschreiben.
Folgendes hab ich dazu gemacht:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)-(.*).php$ /$1_$2.php [L]
RewriteRule ^(.*)_(.*).php$ /$1-$2.php [R=permanent,L]
</IfModule>
Das Problem dabei: Es gibt eine Endlosschleife, weil der Apache scheinbar intern einen neuen Request an sich selbst stellt und dabei wieder seine eigenen Rules durchgeht. Ruft man also eine Datei *-*.php ab kriegt man wieder einen Redirekt zu genau der gleichen Datei.
Ich hab es auch schon mit ENV-Variablen versucht (in Zeile 3 nach L sowas wie ,E=WasHTML:yes und dann in Zeile 4 "RewriteCond %{ENV:WasHTML} !^yes$" - scheint aber auch nichts zu bringen weil meine Variable irgendwie immer leer bleibt)
Wer hat ne Idee wie man das machen kann?
Gruß.
hi,
RewriteRule ^(.*)-(.*).php$ /$1_$2.php [L]
RewriteRule ^(.*)_(.*).php$ /$1-$2.php [R=permanent,L]Das Problem dabei: Es gibt eine Endlosschleife, weil der Apache scheinbar intern einen neuen Request an sich selbst stellt und dabei wieder seine eigenen Rules durchgeht.
Das Flag L beim Redirect ist witzlos, weil anschließend ein neuer externer Request durch den Client erfolgt - neue Anfrage, das ganze Spiel _muss_ von vorne losgehen.
Wie wär's denn, wenn du die Reihenfolge der Regeln mal umdrehst?
Erst *_* in *-* umschreiben, Redirect machen.
Neuer Request, auf das Muster *_* passt die Anfrage nicht mehr, also wird nur die nachfolgende Regel ausgeführt, die aus *-* wieder *_* macht.
Und da sollte jetzt das Flag L gesetzt sein, damit es jetzt nicht mit *_* wieder intern mit der Umschreibung weitergeht, was dann wieder einen Redirect auslösen würde, ...
gruß,
wahsaga
re:hi,
Wie wär's denn, wenn du die Reihenfolge der Regeln mal umdrehst?
Erst *_* in *-* umschreiben, Redirect machen.
Neuer Request, auf das Muster *_* passt die Anfrage nicht mehr, also wird nur die nachfolgende Regel ausgeführt, die aus *-* wieder *_* macht.
Und da sollte jetzt das Flag L gesetzt sein, damit es jetzt nicht mit *_* wieder intern mit der Umschreibung weitergeht, was dann wieder einen Redirect auslösen würde, ...
Bringt leider nichts. Er kommt egal in welcher Reihenfolge immer an den Punkt, dass er von *-* auf *_* die URL nicht einfach umschreibt und dann die richtige Datei nimmt sondern er stellt grundsätzlich ein neuen Request vom Apache an sich selbst und läuft alles nochmal durch.
Ich hab schon überlegt ob man den neuen Request nicht verhindern kann indem man statt /$1_$2.php einfach den kompletten Pfad (%{DOCUMENT_ROOT}/$1_$2.php) angibt - hat aber auch keinen Effekt.
Ebenfalls versucht:
RewriteCond %{IS_SUBREQ} !^true$
bringt aber auch nichts, weil's scheinbar nur für Subrequests anderer Module gilt und nicht für Subrequests von mod_rewrite an sich selbst.