2009-11-11 21 views
5

Mam stronę internetową, gdzie różne części parse request URLs by themselves, a niektóre nie (np. Forum vBulletin). .htaccess Mam do wysyłania żądań do odpowiednich skryptów jest:Czy niektóre RewriteCond wpływają na wiele zasad

# wiki, shop, admin 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !(.*)\.js 
RewriteRule ^wiki/(.*)$ w/index.php?title=$1 [PT,L,QSA] 
RewriteRule ^wiki/*$ wiki/ [L,QSA] 
RewriteRule ^shop/ /shop/shop.php [NC,L] 
RewriteRule ^forum/admincp/pkr/ /forum/admincp/pkr/pkr.php [NC,L] 

To nie działa tak, jak się spodziewałem. Zapomniałem, że warunki przepisywania są stosowane tylko do pierwszej reguły, która następuje po nich. Pytanie brzmi: W jaki sposób mogę zastosować te poprawki do tych wszystkich zasad bez konieczności ich 4-krotnego kopiowania?


Co idzie źle to:

  • /sklep/przykładem jest przepisany do /shop/shop.php
  • /shop/shop.php jest następnie przepisywane ponownie do sklepu//shop.php (czytaj: mamy nieskończoną pętlę). To się nie stanie, jeśli warunek ten został zastosowany do tej reguły przepisywania, bo /shop/shop.php jest rzeczywisty plik:

    RewriteCond% {REQUEST_FILENAME} -f

Więc tak ...

Odpowiedz

5

Odwrócić ekspresja i dołączyć go do złamanie przepisu:

RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} (.*)\.js 
RewriteRule^- [L] 
0

lub Wystarczy dokonać innego warunku jak

RewriteCond %{THE_REQUEST} !shop.php 

lub nawet lepiej

RewriteCond %{THE_REQUEST} !(.*)\.php 
5

nie rozumiałem odpowiedź gumbo, tak Oto co znalazłem to, co działa:

Zamiast dopasowania coś i wykonanie więcej niż jednego RewriteRule z tego testu , możesz odwrócić regułę dopasowania (np. używając! sign) i jeśli go nie znajdzie, pomiń X liczbę reguł. Takich jak:

RewriteCond %{HTTP_HOST} !^www.mydomain.com [NC] 
RewriteRule . - [S=2] # Skip the below X lines if the above test passes 
RewriteRule ^/images/(.*) /resources/images/$1 [L] 
RewriteRule ^/favicon.ico /resources/favicon.ico [L] 

Więc jeśli HTTP_HOST rozpoczyna www.mydomain.com chcę dwa ostatnie RewriteRules mają być przetwarzane. Ale to, co robię, to jeśli HTTP_HOST ma nie zacząć od www.mydomain.com, pomiń kolejne dwie reguły. Pierwsza RewriteRule: . - [S=2] tak naprawdę niczego nie zmienia, ale flaga S = 2 oznacza pominięcie kolejnych reguł X = 2.

Trochę odwrotnej logiki, jeśli mnie pytasz.

+0

Dzięki za poświęcenie czasu na wyjaśnienie odpowiedzi dla nas! +1 –

+1

Jest to całkiem fajne, ale także nieco skomplikowane, jeśli ktoś doda regułę przepisywania później i zapomni zaktualizować liczbę linii, aby pominąć niepożądane zachowanie. – Leven

Powiązane problemy