.htaccess 지시문을 사용하여 특정 URL을 리디렉션하지 않음

PrettyURL(제 경우에는 CakePHP)에 대한 '.htaccess' RewriteRules에 크게 의존하는 애플리케이션에서 이 재작성에서 특정 디렉토리를 제외하도록 지시문을 올바르게 설정하려면 어떻게 해야 하나요? 즉:

/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]

지금까지는 요청이 더 이상 재작성되지 않도록 작동했지만 이제는 ^(static|otherDir).*$와 일치하지 않아야 하는 합법적인 Cake 요청까지 포함하여 모든 요청이 건너뛰고 있습니다.

이 규칙의 여러 가지 변형을 시도했지만 원하는 방식으로 작동하도록 할 수 없습니다.

해결책

그리고 정답은...

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]
해설 (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)