2011-10-13 59 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使用第一個重寫規則的結果呢?

例如,如果我請求/onestaticfile.txt,並且該文件實際上存在於/ app/webroot中,那麼如何確定最終的url將是/app/webroot/onestaticfile.txt而不是/app/webroot/index.php?url=onestaticfile.txt

+1

在虛擬主機(未在.htaccess)添加'RewriteEngine敘述On','RewriteLogLevel 9','RewriteLog /路徑/到/ A/rewrite.log'看看會發生什麼。 – regilero

+0

在Apache 2.4中,像'LogLevel warn rewrite:trace8'。 'RewriteLogLevel'已被刪除。 –

回答

1

舉例來說,如果我要求/onestaticfile.txt和文件實際上在/ app/webroot的存在,如何確保最終的URL將/app/webroot/onestaticfile.txt,而不是/app/webroot/index.php?url=onestaticfile.txt

第二個規則的RewriteConds將得到評估。 !不過既然onestaticfile.txt存在,它將失敗-f測試第二條規則將不會應用(所以最終網址是:/app/webroot/onestaticfile.txt)。同樣,如果onestaticfile.txt不存在,則會應用第二條規則。

在這兩種情況下,當應用規則,內部重定向發生,整個事情與重寫的URI再次發生。但第二次不會改變基本URI(沒有查詢字符串),所以第二次沒有任何事情發生。

如果你有在方括號中的第一條規則的L,第二個規則永遠不會被應用,因爲重寫總是會第一個規則的結束。