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]
이전 규칙에서 [L]을 제거합니다:
RewriteBase /appRoot
RewriteRule ^$ app/webroot/
RewriteRule (.*) app/webroot/$1
[L]은 "여기서 재작성 프로세스를 중지하고 더 이상 재작성 규칙을 적용하지 않습니다."를 의미합니다;