Você precisa:
- Verifique se o arquivo de destino (com a extensão
.php
) existe antes reescrevê-lo internamente - Evite reescrever diretórios (para os quais a raiz do documento é uma).
- Evite regravar apenas a raiz do documento (como no seu exemplo).
Por exemplo, para evitar a regravação apenas da raiz do documento, como no seu exemplo específico, você pode modificar a diretiva RewriteCond
existente:
# Add .php extension for final internal redirect RewriteCond %{REQUEST_URI} ^(.*)$
para ler:
RewriteCond %{REQUEST_URI} ^(/.+)$
/.+
corresponde a uma barra seguida por algo , o que excluiria a raiz do documento, já que a raiz do documento é naturalmente uma barra por si só.
Para evitar a regravação de todos os diretórios (dos quais a raiz do documento é um), você pode adicionar uma condição adicional para evitar a regravação de URLs que mapeiam para um diretório físico. Por exemplo:
RewriteCond %{REQUEST_URI} ^(/.+)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.php$ %1.php [NC,L]
No entanto, se você tiver diretórios acessíveis, modifique a regra existente que remove as barras à direita. Caso contrário, você provavelmente obterá um loop de redirecionamento ao solicitar um diretório (já que mod_dir adicionará uma barra por padrão). Por exemplo:
# Remove trailing slashes RewriteRule ^(.*)\/$ $1 [NC,L,R=301]
Deve ser modificado para incluir a mesma condição acima:
# Remove trailing slashes, unless the request maps to a directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [L,R=301]
Além disso, não é necessário o sinal NC
aqui. E não há necessidade de escapar da barra no padrão RewriteRule
.
Suponho que você também deve ter uma diretiva RewriteBase
definida em outro lugar em seu arquivo, caso contrário, isso provavelmente resultará em um redirecionamento inválido em .htaccess
.