Директивы .htaccess для *не* перенаправления определенных URL-адресов

В приложении, которое сильно полагается на .htaccess RewriteRules для своих PrettyURLs (CakePHP в моем случае), как мне правильно настроить директивы, чтобы исключить определенные каталоги из этой перезаписи? А именно:

/appRoot/.htaccess
         app/
         static/

По умолчанию каждый запрос к /appRoot/* переписывается для того, чтобы попасть в app/webroot/index.php, где он анализируется и вызываются соответствующие действия контроллера. Это делается с помощью этих директив в .htaccess:

RewriteBase /appRoot

RewriteRule ^$ app/webroot/     [L]
RewriteRule (.*) app/webroot/$1 [L]

Теперь я хочу исключить несколько директорий, например static/, из этой переписи. Я пробовал с этим до Cake RewriteRules:

RewriteCond $1 ^(static|otherDir).*$ [NC]
RewriteRule (.*) - [L]

Это работает до тех пор, пока запросы больше не переписываются, но теперь все запросы пропускаются, даже легитимные запросы Cake, которые не должны соответствовать ^(static|otherDir).*$.

Я попробовал несколько вариаций этих правил, но не могу добиться того, чтобы они работали так, как я хочу.

Решение

И правильный ответ...

RewriteRule   ^(a|bunch|of|old|directories).* - [NC,L]

# all other requests will be forwarded to Cake
RewriteRule   ^$   app/webroot/   [L]
RewriteRule   (.*) app/webroot/$1 [L]

Я все еще не понимаю, почему файл index.php в корневом каталоге был вызван изначально, даже с этими директивами на месте. Теперь он находится в

/appRoot/app/views/pages/home.ctp

и также обрабатывается через Cake. Полагаю, что это тоже сработало бы (слегка измененная версия предложения Mike'a, не проверено):

RewriteCond $1      !^(a|bunch|of|old|directories).*$ [NC]
RewriteRule ^(.*)$  app/webroot/$1 [L]
Комментарии (0)

Удалите [L] из предыдущих правил:

RewriteBase /appRoot

RewriteRule ^$ app/webroot/    
RewriteRule (.*) app/webroot/$1

[L] означает "Остановите процесс переписывания здесь и больше не применяйте никаких правил переписывания."

Комментарии (0)

Не могли бы вы применить условие к следующим правилам, но с отрицанием, как в (с некоторыми вариациями этого, я'не слишком хорошо помню правила .htaccess, поэтому флаги могут быть неправильными):

RewriteCond $1 !^(static|otherDir).*$ [NC]
RewriteRule ^$ app/webroot/ [L]

RewriteCond $1 !^(static|otherDir).*$ [NC]
RewriteRule ^$ app/webroot/$1 [L]
Комментарии (0)