Пусть некоторые RewriteCond влияют на несколько правил - PullRequest
5 голосов
/ 11 ноября 2009

У меня есть веб-сайт, на котором различные части сами разбирают 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 / example переписан в /shop/shop.php
  • / shop / shop.php затем снова переписывается в /shop/shop.php (читай: у нас бесконечный цикл). Этого не произойдет, если это условие будет применено к этому правилу перезаписи, потому что /shop/shop.php является фактическим файлом:

    RewriteCond% {REQUEST_FILENAME}! -F

Так что да ...

Ответы [ 3 ]

5 голосов
/ 26 августа 2010

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

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

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

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

5 голосов
/ 11 ноября 2009

Инвертировать выражение и присоединить его к нарушающему правилу:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} (.*)\.js
RewriteRule ^ - [L]
0 голосов
/ 11 ноября 2009

или просто создайте другое условие, например

RewriteCond %{THE_REQUEST} !shop.php

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

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