Schrift
[thread]3108[/thread]

mod_rewrite und logische Fallunterscheidung (Seite 2)



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
cbxk1xg
 2004-04-17 01:43
#30695 #30695
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Oh, Mann... Danke!!! Die RegEx und die Back-reference stimmen schon mal. Allerdings stimmt irgendwas in der 3. Zeile nicht. Wenn ich diese Zeile rausnehme, klappt es - also die RegEx und die Backreference und somit auch das aufrufen der Datei:

Code: (dl )
1
2
3
4
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} .*/([^/]+\.htm)$
#RewriteCond /-/Cache/%1 -s
RewriteRule .* /-/Cache/%1 [L]


Ich verstehe nur nicht, was daran falsch ist, denn der Pfad stimmt ja, sonst könnte er die Datei ja auch nicht aufrufen. Also muss man doch auch vorher rausfinden können, ob die Datei überhaupt da ist?!

Und bei Regel 2 müsste ich irgendwie die Dateiendung wieder entfernen also aus "datei.htm" muss "datei" werden, sonst will das script nicht. Geht das irgendwie per RegEx?

Mal ne generelle Frage: Ist die Syntax der mod_rewrite RegEx 100% gleich mit der in Perl?
cbxk1xg
 2004-04-17 18:35
#30696 #30696
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
OK. Ich habe jetzt herrausgefunden warum die Prüfung mit -s immer fehl schlug. Die RewriteBase war einfach falsch. *grrr* Und ich muss erst den Pfad mit einer anderen Regel umschreiben, um dessen Existenz zu prüfen.

Jetzt habe ich die folgenden Zeilen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} .*/([^/]+\.htm)$
RewriteRule .* -/Cache/%1

# "$1" enthält das Ergebniss der letzten Regel und
# schreibt alles ".*" um auf "$1", wenn es existiert. Hossa!
RewriteCond $1 -s
RewriteRule .* $1 [L]

# Hier sollte Testweise alles was nicht matched
# eine andere Aktion auslösen. - GEHT ABER NICHT!
RewriteCond $1 !-s
RewriteRule .* http://foo.bar/ [L]


Aus irgendeinem Grund wird jetzt immer die zweite Regel benutzt. Aber warum (zur Hölle!) Das Flag L sollte doch alle weiteren Regeln vom Überschreiben abhalten, wenn die Regel erfolgreich war!

Und nun wieder das alte Spiel, wenn ich die zweite Regel inkl. Ihrer Cond rausnehme dann kommt die Datei aus dem Cache, wenn Sie da ist, ansonsten gibt es einen 404.

Es ist zum heulen.
jan
 2004-04-17 18:48
#30697 #30697
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
nein, ich glaube nicht, dass mod_rewrite und perl regexp gleich sind. ähnlich, aber nicht unbedingt gleich. leider.
du kannst natürlich \.htm einfach herausnehmen, musst dann aber noch eine zusätzliche bedingung aufnehmen, die sicherstellt, dass es nicht dein script ist, das aufgerufen wird, sonst baust du dir eine potentielle endlosschleife ein, weil jeder request umgeleitet würde, auch der interne zugriff auf dein script - und schon geht's unendlich so weiter.

stimmt, an sich sollte [L] dafür sorgen, dass keine weiteren Rules mehr angewendet werden - aber nur in diesem request, d.h. die rewriteengine erzeugt ja intern einen neuen request mit dem umschreiben und der kann dann natürlich wieder umgeschrieben werden, wenn ich das konzept richtig verstanden habe.

wieso sollte $1 das ergebnis der letzten regel enthalten? $1 enthält die ersten, matchenden, geklammerten werte aus der letzten RewriteRule-Zeile - aber da hast du keine Klammerung. ich denke immer noch, dass du rewriten und prüfen in einer rule laufen lassen solltest.
gehen wir einen schritt zurück zu
Code: (dl )
1
2
3
4
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} .*/([^/]+\.htm)$
#RewriteCond /-/Cache/%1 -s
RewriteRule .* /-/Cache/%1 [L]


ich tippe, dass der grund, warum das ganze nicht matcht, einfach darin liegt, dass /-/Cache/ nicht existiert, und damit natürlich dann auch keine Datei darin. -s testet, meine ich, den lokalen pfad, d.h. man müsste noch das DOCROOT davor setzen, um den gewünschten Effekt zu erzielen. etwa so:

Code: (dl )
1
2
3
4
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} .*/([^/]+\.htm)$
RewriteCond %{DOCUMENT_ROOT}/-/Cache/%1 -s
RewriteRule .* /-/Cache/%1 [L]



wie sieht's damit aus?
selbiger ansatz müsste dann auch für deinen letzten ansatz gelten:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} .*/([^/]+\.htm)$
RewriteRule .* -/Cache/%1

# "$1" enthält das Ergebniss der letzten Regel und
# schreibt alles ".*" um auf "$1", wenn es existiert. Hossa!
RewriteCond %{DOCUMENT_ROOT}/$1 -s
RewriteRule .* $1 [L]

# Hier sollte Testweise alles was nicht matched
# eine andere Aktion auslösen. - GEHT ABER NICHT!
RewriteCond %{DOCUMENT_ROOT}/$1 !-s
RewriteRule .* http://foo.bar/ [L]


wobei ich immer noch an $1 zweifle.
cbxk1xg
 2004-04-17 21:09
#30698 #30698
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Aber der Witz an der Sache ist doch, dass eine Regel nur ausgeführt wird, wenn die Cond passen. Und genau das passiert wenn ich den zweiten Regelblock rausnehme. Also nur:

Code: (dl )
1
2
3
4
5
6
7
8
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} .*/([^/]+\.htm)$
RewriteRule .* -/Cache/%1

# "$1" enthält das Ergebniss der letzten Regel und
# schreibt alles ".*" um auf "$1", wenn es existiert. Hossa!
RewriteCond $1 -s
RewriteRule .* $1 [L]


...funktioniert. Aber wenn ich noch das hier ranhänge:
Code: (dl )
1
2
3
4
# Hier sollte Testweise alles was nicht matched
# eine andere Aktion auslösen. - GEHT ABER NICHT!
RewriteCond $1 !-s
RewriteRule .* http://foo.bar/ [L]


zeigt alles auf http://foo.bar ?!?! Das ergibt doch keinen Sinn! Ich habe es auch schon mit [S=1] probiert. Aber das brachte auch nix. Und wenn der Pfad nicht existieren würde, dann dürfte der erste Block an Regeln jetzt auch nicht funktionieren. Um das zu beweisen habe ich esmal mit !-s getestest. Wie erwartet bekam ich einen 404, weil die Regel nicht griff. So langsam verliere ich meine gute Laune... :angry:
jan
 2004-04-17 22:05
#30699 #30699
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
probier dieses mal aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} .*/([^/]+\.htm)$
RewriteCond %{REQUEST_URI} !/-/Cache/
RewriteCond %{DOCUMENT_ROOT}/-/Cache/%1 -s
RewriteRule .* /-/Cache/%1 [L]

# Hier sollte Testweise alles was nicht matched
# eine andere Aktion auslösen. - GEHT ABER NICHT!
RewriteCond %{REQUEST_URI} .*/([^/]+\.htm)$
RewriteCond %{DOCUMENT_ROOT}/-/Cache/%1 !-s
RewriteRule .* http://www.thejway.de/ [L]



wichtig ist:
RewriteCond %{REQUEST_URI} !/-/Cache/
um zu verhindern, dass wir in eine endlosschleife laufen (/-/Cache/hallo.htm endet auch auf .htm)
und DOCUMENT_ROOT als zusatz bei der prüfung. im untern part mache ich im grunde das selbe. sicherstellen, dass es ein request auf eine htm-datei ist, dann sicherstellen, dass die datei im cache nicht existiert, dann umleiten
cbxk1xg
 2004-05-01 03:51
#30700 #30700
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Danke, Ihr seid alle spitze!

Manchmal ist es gut etwas Zeit ins Land gehen zu lassen, bevor man sich einem ungelösten Problem erneut widmet...

Ich habe die Lösung gefunden! Ich habe mal testweise %{DOCUMENT_ROOT} als Querystring an einen Redirect-URL angehangen und siehe da, es stand nicht meine Document-root da, sondern die des Apache-Servers. Das heisst %{DOCUMENT_ROOT} ist nicht das gleiche wie in Perl $ENV{'DOCUMENT_ROOT'}!

Ich habe also nun einfach die DOCUMENT_ROOT von Hand eingetragen und eine SKIP-Option eingefügt. Das war's!

@ Jan: DANKE! Ohne Dich wäre ich da nie darauf gekommen. Ich glaube ich habe jetzt so viel rumprobiert und gelesen, dass ich beim nächsten auch mal jemand anderem helfen kann; als "Mod_rewrite-Profi". :-)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
RewriteEngine on
RewriteBase /

# Get file from Cache.
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} .*/([^/]+\.htm)$
RewriteCond /homepages/123/htdocs/Cache/%1 -s
RewriteRule .* Cache/%1 [QSA,S=2]

# Get file via CMS.
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} .*/([^/]+\.htm)$
RewriteCond /homepages/123/htdocs/Cache/%1 !-s
RewriteRule (.*)\.htm$ /homepages/123/htdocs/CMS.pl?PID=$1 [T=application/x-httpd-cgi,QSA,L]


Die RewriteCond konnte vorher gar nicht mit -s prüfen, da der Pfad einfach falsch war. Außerdem ist die RewriteBase enorm wichtig. Bei Multidomainhosting wird das noch viel wichtiger.

Jetzt tut alles so wie es soll und ich trinke erst mal ein Bier!
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2004-04-16 16:31.