У некоторых RewriteCond влияют несколько правил

У меня есть веб-сайт, где различные части анализируют URL-адреса запроса самостоятельно, а некоторые нет (например, форум vBulletin). .htaccess Мне нужно отправить запросы на сценарии присваивания:

# 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] 

Это не работает, как я ожидал. Я забыл, что условия перезаписи применяются только к первому правилу, которое следует за ними. Вопрос в том, как я могу применить те RewriteCond для всех этих правил без необходимости копировать их в 4 раза?


Что не так, так это:

  • / магазин / пример переписан на /shop/shop.php
  • /shop/shop.php затем переписывается снова в /shop/shop.php (читайте: у нас есть бесконечный цикл). Этого не произойдет, если это условие применяется к этому правилу перезаписи, потому что /shop/shop.php является фактическим файлом:

    RewriteCond% {REQUEST_FILENAME}! -f

Так что да…

Инвертируйте выражение и присоедините его к правилу разбиения:

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

Я не понял ответа Гумбо, вот что я нашел, что работает:

Вместо того, чтобы сопоставлять что-то и выполнять более одного RewriteRule из этого теста, вы можете инвертировать правило соответствия (например, используя знак!), А если оно не находит его, пропустите X число правил. Такие как:

 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] 

Поэтому, если HTTP_HOST начинается с http://www.mydomain.com, я хочу, чтобы два последних RewriteRules были обработаны. Но что я делаю, если HTTP_HOST не начинается с http://www.mydomain.com, пропустите следующие два правила. Первый RewriteRule:. . - [S=2] фактически ничего не меняет, но флаг S = 2 означает пропустить следующие правила X = 2.

Если вы спросите меня, немного обратная логика.

или Просто сделайте еще одно условие, подобное

 RewriteCond %{THE_REQUEST} !shop.php 

или даже лучше

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