Para remover apenas .php dos meus URLs, atualmente tenho o seguinte
# Remove trailing slashes
RewriteRule ^(.*)\/$ $1 [NC,L,R=301]
# Remove trailing .php extensions
RewriteCond %{THE_REQUEST} (\S*?)/(.*?)\.php [NC]
RewriteRule ^ %1/%2 [L,R=301]
# Add .php extension for final internal redirect
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule !\.php$ %1.php [NC,L]
Mas essas regras não funcionam de forma simples, example.com
pois acabam como example.com/.php
. Então, como posso consertar isso?
Responder1
Você precisa:
- Verifique se o arquivo de destino (com a
.php
extensão) existeantesreescrevendo internamente para ele - Evite reescrever diretórios (para os quais a raiz do documento seja uma delas).
- Evite reescrever apenas a raiz do documento (como no seu exemplo).
Por exemplo, para evitar reescrever apenas a raiz do documento, como no seu exemplo específico, você pode modificar a RewriteCond
diretiva existente:
# Add .php extension for final internal redirect RewriteCond %{REQUEST_URI} ^(.*)$
ler:
RewriteCond %{REQUEST_URI} ^(/.+)$
/.+
corresponde a uma barra seguida poralgo, o que excluiria a raiz do documento, uma vez que a raiz do documento é naturalmente uma barra por si só.
Para evitar a reescrita de todos os diretórios (dos quais a raiz do documento é um), você pode adicionar uma condição adicional para evitar a reescrita de URLs mapeadas 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, deverá modificar sua regra existente que remove barras finais; caso contrário, você provavelmente obterá um loop de redirecionamento ao solicitar um diretório (já que mod_dir anexará 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 há necessidade da NC
bandeira aqui. E não há necessidade de escapar da barra noRewriteRule
padrão.
Presumo que você também deva ter uma RewriteBase
diretiva definida em outro lugar do seu arquivo; caso contrário, isso provavelmente resultará em um redirecionamento inválido em .htaccess
.