包含%{REQUEST_FILENAME}
如下字符串:
/web/webroot/index.php
我看到很多人建议测试某个文件是否存在且具有 .php 扩展名,如下所示:
RewriteCond %{REQUEST_FILENAME}.php -f
.php
后面的不是%{REQUEST_FILENAME}
多余的吗?变量中应该已经包含 了.php
,对吧?
似乎添加.php
之后%{REQUEST_FILENAME}
会使 TestString 检查添加一个额外的 .php,如下所示:
/web/webroot/index.php.php
我错过了一些简单的东西,我确信如此,但我只是不知道它是什么。
背景是这样的:
RewriteCond %{THE_REQUEST} ^.*?\.php [NC]
RewriteRule ^ - [R=404,NE,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]
答案1
.php
后面的不是%{REQUEST_FILENAME}
多余的吗?变量中应该已经包含 了.php
,对吧?
嗯,是也不是,这取决于你想做什么。
RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^ %{REQUEST_FILENAME}.php [L]
此规则允许您请求无扩展名的 URL。例如,/index
或/foo
和这会在内部分别将请求重写为/index.php
和/foo.php
。
在此例中,REQUEST_FILENAME
是形式为 的字符串/web/webroot/index
。因此,在重写为相同内容之前,它会测试是否/web/webroot/index.php
存在。如果您要请求,/index.php
那么状况失败并且没有发生重写(这是正确的)。
但是,此规则并不完全正确,在某些情况下可能会导致重写循环。请参阅以下相关问题: