2011-10-13 1 views
1

다음과 같은 경우입니다.mod_rewrite는 각각의 재 작성 규칙 후에 {REQUEST_FILENAME}을 평가합니까?

RewriteEngine On 
RewriteBase /app/webroot/ 

RewriteRule ^(.*)$ $1 [QSA] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

두 번째 규칙의 RewriteConds가 첫 번째 RewriteRule의 결과를 사용합니까?

예를 들어, /onestaticfile.txt을 요청하고 해당 파일이/app/webroot에 실제로 존재한다면 최종 URL은 /app/webroot/index.php?url=onestaticfile.txt 대신 /app/webroot/onestaticfile.txt이 될 것입니다.

+1

가상 호스트 (.htaccess에 없음)에'RewriteEngine On','RewriteLogLevel 9','RewriteLog/path/to/a/rewrite.log'를 추가하고 무슨 일이 일어나는 지보십시오. – regilero

+0

Apache 2.4에서'LogLevel warn rewrite : trace8'과 같은 것입니다. 'RewriteLogLevel'이 제거되었습니다. –

답변

1

는 예를 들어, 어떻게 최종 URL이 /app/webroot/onestaticfile.txt 대신 /app/webroot/index.php?url=onestaticfile.txt 될 것이라고 확신 할 수 있습니다?

두 번째 규칙에 대한 RewriteConds가 평가됩니다. 그러나 onestaticfile.txt이 존재하므로! -f 테스트에 실패하고 두 번째 규칙이 적용되지 않습니다 (최종 URL은 /app/webroot/onestaticfile.txt). 마찬가지로 onestaticfile.txt이 없으면 두 번째 규칙이 적용됩니다.

두 경우 모두 규칙을 적용하면 내부 리디렉션이 발생하고 모든 내용이 다시 작성된 URI로 다시 발생합니다. 하지만 두 번째 시간은 쿼리 문자열없이 기본 URI를 변경하지 않으므로 두 번째로 아무 일도 일어나지 않습니다.

첫 번째 규칙의 대괄호에 L이있는 경우 다시 쓰기가 항상 첫 번째 규칙으로 끝나기 때문에 두 번째 규칙이 적용되지 않습니다.