mod_rewrite REQUEST_FILENAME在没有L标志

时间:2017-06-22 18:36:06

标签: php apache .htaccess mod-rewrite

我正在处理一个.htaccess文件,并且遇到了REQUEST_FILENAME的一些好奇行为,我希望对此有所了解。我有两个我正在测试的规则是这样的:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.*$ /index.php [QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/index.php$ /other_page.php [L]

当我尝试转到地址site.com/this_file_exists.php时,我似乎要转到other_page.php,这意味着 REQUEST_FILENAME是第一个RewriteCond中的文件,但不是文件 当mod_rewrite处理第二个RewriteCond时。

将第二个RewriteRule的标志更改为[L,E=RF:%{REQUEST_FILENAME}]echo $_SERVER['REDIRECT_RF'] other_page.php后,我发现请求文件名仅为/index.php,与原始文件名相对,即/full/path/to/this_file_exists.php

匹配RewriteRule后,mod_rewrite是否一直以这种方式覆盖REQUEST_FILENAME?如果是这样,是否有记录的方式来做到这一点?

1 个答案:

答案 0 :(得分:0)

mod_rewrite.c

中的这些行
/* Now adjust API's knowledge about r->filename and r->args */
r->filename = newuri;

似乎暗示新的REQUEST_FILENAME真的是 重写的URI。