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

StackOverflow https://stackoverflow.com/questions/3157

  •  08-06-2019
  •  | 
  •  

Вопрос

В приложении, которое в значительной степени зависит от .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/.Я попробовал с этим до Правила перезаписи торта:

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

RewriteCond $1      !^(a|bunch|of|old|directories).*$ [NC]
RewriteRule ^(.*)$  app/webroot/$1 [L]

Другие советы

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

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

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

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

RewriteBase /appRoot

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top