原本以為若網址為真實檔案的request,rewrite設定就不會啟用,但實際上不是這樣,而是會完完全全按照rewriteRule的規則來運作。
若要達成實際檔案存在時不執行rewrite設定,實際上就是要設定一組rewrite規則來運作。例如:
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ – [NC,L]
上述設定是指,當實際request的檔名是symbolic link(-l),或是檔案大小大於0的檔案(-s),或是目錄,並且實際存在時,則執行^.*$ – [NC,L] 這個規則,實際上就是完全不改寫,「-」代表使用原本的要求檔名。NC是指不分大小寫,L是指不再參考後續的rewriteRule。
另外,rewriteCond允許連續多行設定,但只影響緊接在該組rewriteCond後第一個rewriteRule設定。例如下列狀況,第一個RewriteRule會在符合上述所有的RewriteCond時執行,而第二個rewriteRule則和他們完全無關。
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ – [NC,L]
#與上述rewriteCond和rewriteRule無關
RewriteRule ^.*$ index.php [L]