O que significa %{REQUEST_FILENAME}.ext? Por que o final extra .ext?

O que significa %{REQUEST_FILENAME}.ext? Por que o final extra .ext?

O %{REQUEST_FILENAME}contém uma string como esta:

/web/webroot/index.php

Vejo que muitas pessoas recomendam testar se um arquivo existe e tem uma extensão .php como esta:

RewriteCond %{REQUEST_FILENAME}.php -f

.phpO depois não é %{REQUEST_FILENAME}redundante? A variável já deve conter o .php, certo?

Parece que adicionar .phpdepois %{REQUEST_FILENAME}faria com que a verificação TestString adicionasse um .php extra, assim:

/web/webroot/index.php.php

Estou sentindo falta de algo simples, tenho certeza disso, mas simplesmente não sei o que é.

O contexto é este:

RewriteCond %{THE_REQUEST} ^.*?\.php [NC]
RewriteRule ^ - [R=404,NE,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

Responder1

.phpO depois não é %{REQUEST_FILENAME}redundante? A variável já deve conter o .php, certo?

Bem, sim e não, depende do que você está tentando fazer.

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

Esta regra permite solicitar URLs sem extensão. por exemplo. /indexou /fooe isso reescreve internamente a solicitação para /index.phpe /foo.phprespectivamente.

Neste caso, REQUEST_FILENAMEé uma string no formato /web/webroot/index. Então, são testes que /web/webroot/index.phpexistem antes de reescrever o mesmo. Se você solicitasse /index.phpentão odoençafalha e nenhuma reescrita ocorre (o que é correto).

No entanto, esta regra não é estritamente correta e pode causar um loop de reescrita sob certas condições. Veja a seguinte pergunta relacionada:

informação relacionada