У меня есть веб-сайт, где различные части анализируют 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 является фактическим файлом:
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