%{REQUEST_FILENAME}.ext 是什么意思?为什么有额外的 .ext 结尾?

%{REQUEST_FILENAME}.ext 是什么意思?为什么有额外的 .ext 结尾?

包含%{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那么状况失败并且没有发生重写(这是正确的)。

但是,此规则并不完全正确,在某些情况下可能会导致重写循环。请参阅以下相关问题:

相关内容