Shouldn't it fail when it sees that
test/test.php
doesn't exist? (RewriteCond %{REQUEST_FILENAME}\.php -f
) I get the same result if I simply append a slash, liketest/
Ele falharia se essa fosse a verificação sendo executada, mas não é.
A variável do servidor REQUEST_FILENAME
contém o caminho do sistema de arquivos após a URL foi mapeada para o sistema de arquivos. Isso não é necessariamente o mesmo que o caminho da URL com o qual o padrão RewriteRule
corresponde.
Por exemplo, no seu caso, ao solicitar /test/test.php
quando não houver um subdiretório físico chamado /test
, a variável de servidor REQUEST_FILENAME
conterá uma string com o formato /absolute/filesystem/path/to/test
(ou seja, a URL solicitada até o último diretório conhecido + o primeiro segmento de caminho /test
). E o caminho da URL correspondido pelo padrão RewriteRule
será /test/test.php
(ao qual você adicionará repetidamente .php
porque /test.php
existe, conforme verificado pela diretiva RewriteCond
anterior. ).
Você pode resolver isso verificando o caminho do URL (construindo um caminho absoluto do sistema de arquivos para verificar), da mesma forma que o @shanew sugere. Por exemplo:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.*)$ $1.php [L]
Uma otimização, para evitar todas as verificações de sistema de arquivos para cada solicitação, seria incluir uma verificação da extensão .php
(e .css
, .js
, etc.) primeiro, antes de verificar se os arquivos existem :
RewriteCond %{REQUEST_URI} !\.(php|css|js|jpg|png)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.*)$ $1.php [L]
Isso evita verificações desnecessárias quando o URL solicitado já termina com .php
, .css
, etc.