Removendo .php de example.com/.php

Removendo .php de example.com/.php

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.compois acabam como example.com/.php. Então, como posso consertar isso?

Responder1

Você precisa:

  • Verifique se o arquivo de destino (com a .phpextensã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 RewriteConddiretiva 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 NCbandeira aqui. E não há necessidade de escapar da barra noRewriteRule padrão.

Presumo que você também deva ter uma RewriteBasediretiva definida em outro lugar do seu arquivo; caso contrário, isso provavelmente resultará em um redirecionamento inválido em .htaccess.

informação relacionada