2009-03-30 25 views
12

Ich habe seit Jahren einfache mod_rewrite Regeln für mein CMS verwendet und mache jetzt eine neue Version, ich sehe die rewriteCond nicht sinnvoll - ich habe den Standard "wenn es keine Datei ist "aber ich sehe immer noch die rewriterules ausgewertet, obwohl sie nicht sollen. Mein Umschreiben Code:.htaccess! -f Regel funktioniert nicht

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)$ index.php?page=$1 
RewriteRule ^([^/]+)/([^/]+)$ index.php?page=$1&var=$2 

I load/page/var und es funktioniert gut als index.php page = Seite & var = var, aber ich versuche zu laden /css/file.css und es lädt Index?. php? page = css & var = file.css obwohl /css/file.css ist eine Datei, so dass die ganze Überarbeitung Abschnitt sollte nicht einmal ausgewertet werden.

Ich habe noch nie gesehen, dass Htaccess scheinbar seiner eigenen Logik trotzt. Kann mir jemand dabei helfen, das herauszufinden? Hat jemand schon einmal so etwas erlebt?

Antwort

3

Nun, das sollte funktionieren.

Versuchen Sie, die folgenden Requisiten in der .htaccess Einstellung:

RewriteLog /var/log/rewrite.log 
RewriteLogLevel 3 

Ihre Anfragen zu debuggen. Denken Sie daran, diesen Wert zurückzusetzen, wenn Sie fertig sind, sonst haben Sie am Ende eine vollgestopfte Festplatte.

+0

+1 für das RewriteLog-Zeug, es half mir beim Debuggen meiner Rewrite-Regeln. –

25

Die RewriteCondition s gelten nur für die nächste Regel. Sie wollen dies:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)$ index.php?page=$1 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/([^/]+)$ index.php?page=$1&var=$2 
+2

Das ist toll, nach all den Jahren, in denen ich mod_rewrites so mache, stellt sich heraus, dass meine Logik zufällig funktioniert ... Vielen Dank –

+0

genial, danke !! .. es ist auch gut daran zu denken, wenn die Datei nicht existiert Es wird NICHT 404, es wird nur an die nächste Regel übergeben. – Roberto

+0

@Colin - meine Gefühle genau. Jetzt muss ich herausfinden, ob das eine Erleichterung oder eine Sorge ist ... – Ben

13

Wenn Sie Apache verwenden 2.2, dann müssen Sie diese Zeilen lesen:

http://amandine.aupetit.info/135/apache2-mod_rewrite/

Spoiler: was Sie schreiben müssen, ist eigentlich:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-l   

Merc.

+0

Hinzufügen von '% {DOCUMENT_ROOT}' gelöstes Problem. – hlcs

+1

Ich habe nach sooo lang gesucht, mein Problem vollständig gelöst (ich benutze nicht vhost, aber container). Vielen Dank! – Gildas

+0

Da der Fragesteller keine Antwort akzeptiert, wäre es toll, wenn meine Antwort die meisten Upvotes wirklich bekommen würde ... – Merc