Shouldn't it fail when it sees that
test/test.phpdoesn'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.