Директивы .htaccess * не * перенаправляют определенные URL - PullRequest
21 голосов
/ 06 августа 2008

В приложении, которое в значительной степени зависит от .htaccess RewriteRules для его PrettyURL (в моем случае 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).*$.

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

Ответы [ 3 ]

6 голосов
/ 07 августа 2008

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

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. Теперь, когда все это работает, я думаю, это сработало бы (слегка измененная версия предложения Майка, не проверено):

RewriteCond $1      !^(a|bunch|of|old|directories).*$ [NC]
RewriteRule ^(.*)$  app/webroot/$1 [L]
1 голос
/ 06 августа 2008

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

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

RewriteCond $1 !^(static|otherDir).*$ [NC]
RewriteRule ^$ app/webroot/$1 [L]
1 голос
/ 06 августа 2008

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

RewriteBase /appRoot

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...