2009-03-30 32 views
12

Używam prostych reguł mod_rewrite dla mojego CMS od lat i teraz robię nową wersję, widzę, że przepisywanie nie ma sensu - mam standard "jeśli nie jest plikiem "ale wciąż widzę, że rewizje są oceniane, nawet jeśli nie powinny. Mój kod przepisać:.htaccess! -f reguła nie działa

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

załadować/strony/var i działa dobrze jako index.php page = strona & var = var, ale staram się załadować /css/file.css i ładuje indeks?. php? page = css & var = file.css, mimo że plik /css/file.css to plik, więc cała sekcja przepisywania nie powinna być nawet oceniana.

Nigdy nie widziałem, aby htaccess najwyraźniej przeciwstawiał się własnej logice, czy ktoś może mi pomóc to zrozumieć? Czy ktokolwiek kiedykolwiek natknął się na coś takiego?

Odpowiedz

3

Cóż, to powinno zadziałać.

Spróbuj ustawić następujące rekwizyty w Twojej .htaccess:

RewriteLog /var/log/rewrite.log 
RewriteLogLevel 3 

debugowania żądań. Pamiętaj, aby zresetować tę wartość, gdy skończysz, inaczej skończysz z zapełnionym dyskiem twardym.

+0

+1 za artykuły RewriteLog, pomogło mi to w debugowaniu reguł przepisywania. –

25

S RewriteCondition s dotyczą tylko następnej reguły. Chcesz to:

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

To świetnie, po tych wszystkich latach robiących takie mod_rewrites, okazuje się, że moja logika działa przez przypadek ... dziękuję bardzo –

+0

niesamowite, dziękuję !! ... dobrze jest też pamiętać, że jeśli plik nie istnieje , NIE 404, po prostu przekaże ją do następnej reguły. – Roberto

+0

@Colin - moje uczucia dokładnie. Teraz muszę się dowiedzieć, czy to ulga, czy niepokój ... – Ben

13

Jeśli używasz Apache 2.2, to musisz przeczytać:

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

Spoiler: co będzie trzeba napisać to rzeczywiście:

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

Merc.

+0

Dodanie '% {DOCUMENT_ROOT}' rozwiązanego problemu. – hlcs

+1

Szukałem tego przez tak długo, całkowicie rozwiązany mój problem (nie używam vhost, ale kontener). Dzięki! – Gildas

+0

Ponieważ pytający nie zaakceptuje odpowiedzi, byłoby wspaniale, gdyby moja odpowiedź naprawdę pobudziła ... – Merc

Powiązane problemy