mod_rewrite在每次重写规则后评估{REQUEST_FILENAME}吗?

时间:2011-10-13 14:36:51

标签: apache mod-rewrite

情况如下:

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中,那么如何确保最终网址为/app/webroot/onestaticfile.txt而不是/app/webroot/index.php?url=onestaticfile.txt

1 个答案:

答案 0 :(得分:1)

  

例如,如果我请求/onestaticfile.txt并且该文件实际存在于/ app / webroot中,那么如何确保最终网址为/app/webroot/onestaticfile.txt而不是/app/webroot/index.php?url=onestaticfile.txt

将评估第二条规则的RewriteConds。但由于onestaticfile.txt存在,它将失败!-f测试,第二条规则将不会应用(因此最终网址将为:/app/webroot/onestaticfile.txt)。同样,如果onestaticfile.txt不存在,则会应用第二条规则。

在任何一种情况下,当应用规则时,都会发生内部重定向,并且重写的URI会再次发生。但第二次没有改变基URI(没有查询字符串),所以第二次没有任何反应。

如果您的第一条规则的方括号中有L,则永远不会应用第二条规则,因为重写将始终在第一条规则上结束。