Remova a extensão .php com .htaccess


101

Sim, eu li o manual do Apache e pesquisei aqui. Por alguma razão, simplesmente não consigo fazer isso funcionar. O mais próximo que cheguei foi fazer com que ele remova a extensão, mas ela aponta para o diretório raiz. Eu quero que isso funcione apenas no diretório que contém o .htaccessarquivo.

Preciso fazer três coisas com o .htaccessarquivo.

  1. Eu preciso remover o .php

    uma. Tenho várias páginas que usam guias e a URL se parece com page.php # guia - isso é possível?

    b. Tenho uma página que usa um ID de sessão anexado ao URL para garantir que você veio do lugar certo www.domain.com/download-software.php?abcdefg.

Isso é possível? Além disso, preciso remover ".php" dos links em meu arquivo de inclusão de navegação de cabeçalho? DevemosIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. Eu gostaria que fosse forçado "www" antes de cada URL, então não é domain.com, mas www.domain.com/page.
  2. Eu gostaria de remover todas as barras finais das páginas.

Vou continuar procurando, tentando, etc. Estar em um subdiretório pode causar problemas?



Estou apenas curioso, que benefício é esse? Isso é para que seus usuários não saibam que arquivo em seu servidor estão acessando?
Kolob Canyon de

duas vezes. então eles não sabem quais tipos de arquivo estamos servindo, e parece mais limpo IMO
Dirty Bird Design

Outra questão relacionada: stackoverflow.com/questions/6534904/… .
Edward

Respostas:


121

A resposta de Gumbo na questão Stack Overflow Como ocultar a extensão .html com mod_rewrite do Apache deve funcionar bem.

Re 1) Altere o .html para .php

Re a.) Sim, isso é possível, basta adicionar #tabao URL.

Re b.) Isso é possível usando QSA(Query String Append), veja abaixo.

Isso também deve funcionar em um caminho de subdiretório:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

Obrigado pela sua ajuda man, por qualquer motivo, aposto que devido ao url anexado à sessão estar codificado no arquivo PHP (longa história), eu sou capaz de acessá-lo sem o acima. Eu realmente aprecio sua ajuda, esse material .htaccess é complicado para mim.
Dirty Bird Design de

8
@Pekka 웃 remova o espaço entre os sinalizadores de [L,espaço QSA], caso contrário, ocorrerá 500 Erro Interno do Servidor .
Rahil Wazir

isto fará /index/bla/blacom que seja o mesmo queindex.php
elkebirmed

por algum motivo este bloqueio do meu CSS para carregar: /
TheCrazyProfessor

! significa não. Essa regra diz para reescrever apenas para adicionar .php se ainda não terminar em .php
user339568

72

Apache mod_rewrite

O que você está procurando é o mod_rewrite ,

Descrição: fornece um mecanismo de regravação baseado em regras para regravar URLs solicitados em tempo real.

De um modo geral, mod_rewritefunciona combinando o documento solicitado com as expressões regulares especificadas e, em seguida, realiza reescritas de URL internamente (dentro do processo apache) ou externamente (no navegador do cliente). Essas reescritas podem ser tão simples quanto traduzir internamente example.com/foo em uma solicitação de example.com/foo/bar.

Os documentos do Apache incluem um mod_rewriteguia e acho que algumas das coisas que você deseja fazer são abordadas nele. Guia detalhado do mod_rewrite .

Forçar o wwwsubdomínio

Eu gostaria que fosse forçado "www" antes de cada url, então não é domain.com, mas www.domain.com/page

O guia de reescrita inclui instruções para isso no exemplo de nome de host canônico .

Remova as barras finais (Parte 1)

Eu gostaria de remover todas as barras finais das páginas

Não tenho certeza por que você faria isso, já que o guia de reescrita inclui um exemplo do oposto , ou seja, sempre incluindo uma barra final. Os documentos sugerem que a remoção da barra final tem grande potencial para causar problemas:

Problema de barra final

Descrição:

Todo webmaster pode cantar uma canção sobre o problema da barra final em URLs que fazem referência a diretórios. Se eles estiverem faltando, o servidor descarta um erro, porque se você disser em /~quux/foovez de /~quux/foo/ então o servidor procura um arquivo chamado foo. E porque esse arquivo é um diretório, ele reclama. Na verdade, ele tenta se consertar sozinho na maioria dos casos, mas às vezes esse mecanismo precisa ser emulado por você. Por exemplo, depois de fazer muitas reescritas complicadas de URL em scripts CGI, etc.

Talvez você possa explicar por que deseja remover a barra final o tempo todo.

Remover .phpextensão

Eu preciso remover o .php

A coisa mais próxima de fazer isso que posso pensar é reescrever internamente cada documento de solicitação com uma extensão .php, ou seja, example.com/somepage é processado como uma solicitação para example.com/somepage.php. Observe que proceder dessa maneira exigiria que cada alguma página realmente exista como alguma página.php no sistema de arquivos.

Com a combinação certa de expressões regulares, isso deve ser possível até certo ponto. No entanto, posso prever alguns possíveis problemas com as páginas de índice não sendo solicitadas corretamente e não correspondendo aos diretórios corretamente.

Por exemplo, isso irá reescrever corretamente example.com/test como uma solicitação para example.com/test.php:

RewriteEngine  on
RewriteRule ^(.*)$ $1.php

Mas fará com que example.com não carregue porque não existe example.com/.php

Imagino que, se você remover todas as barras finais, escolher uma solicitação de índice de diretório de uma solicitação de nome de arquivo no diretório pai será quase impossível. Como você determina uma solicitação para o diretório 'foobar':

example.com/foobar

de uma solicitação de um arquivo chamado foobar (que na verdade é foobar.php)

example.com/foobar

Pode ser possível se você usar a RewriteBasediretiva. Mas se você fizer isso, o problema ficará muito mais complicado, pois você exigirá RewriteConddiretivas para fazer a verificação no nível do sistema de arquivos se a solicitação mapeia para um diretório ou arquivo.

Dito isso, se você remover o requisito de remover todas as barras finais e, em vez disso, forçar a adição de barras finais, o problema de "nenhuma extensão .php" se torna um pouco mais razoável.

# Turn on the rewrite engine
RewriteEngine  on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]

Isso ainda não é perfeito - toda solicitação de arquivo ainda tem .php anexado à solicitação internamente. Uma solicitação de 'hi.txt' colocará isso em seus registros de erro:

[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat

Mas há outra opção, defina as diretivas DefaultTypee DirectoryIndexassim:

DefaultType application/x-httpd-php
DirectoryIndex index.php index.html

Atualização de 14/11/2013 - Corrigido o snippet acima para incorporar a observação de Nicorellius

Agora as solicitações para hi.txt (e qualquer outra coisa) são bem-sucedidas, as solicitações para example.com/test retornarão a versão processada de test.php e os arquivos index.php funcionarão novamente.

Devo dar crédito a quem o crédito é devido por esta solução como eu encontrei Michael J. Radwins Blog pesquisando no Google por php no extension apache .

Remova as barras finais

Algumas pesquisas apache remove trailing slashesme levaram a algumas páginas de otimização de mecanismos de pesquisa. Aparentemente, alguns sistemas de gerenciamento de conteúdo (Drupal, neste caso) disponibilizarão conteúdo com e sem uma barra final em URls, o que, no mundo do SEO, fará com que seu site incorra em uma penalidade de conteúdo duplicado. Fonte

A solução parece bastante trivial, usando mod_rewritewe reescrever na condição de que o recurso solicitado termina em a /e reescrever a URL enviando de volta o 301 Permanent Redirectcabeçalho HTTP.

Aqui está seu exemplo, que assume que seu domínio é blamcast.net e permite que a solicitação seja opcionalmente prefixada com www..

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

Agora estamos chegando a algum lugar. Vamos juntar tudo e ver como fica.

Obrigatório www., não .phpe sem barras finais

Isso pressupõe que o domínio é foobar.com e está sendo executado na porta 80 padrão.

# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html

# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST}   !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST}   !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*)         http://www.foobar.com/$1 [L,R,NE]

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

O sinalizador 'R' é descrito na RewriteRuleseção de diretiva. Snippet:

redirect|R [=code](forçar redirecionamento) Substituição de prefixo com http://thishost[:thisport]/(o que torna a nova URL um URI) para forçar um redirecionamento externo. Se nenhum código for fornecido, uma resposta HTTP de 302 ( MOVED TEMPORARIAMENTE ) será retornada.

Nota Final

Não consegui fazer a remoção da barra funcionar com sucesso. O redirecionamento acabou me dando loops de redirecionamento infinitos. Depois de ler a solução original mais de perto, tenho a impressão de que o exemplo acima funciona para eles por causa de como a instalação do Drupal está configurada. Ele menciona especificamente:

Em um site Drupal normal, com URLs limpos habilitados, esses dois endereços são basicamente intercambiáveis

Em referência a URLs que terminam com e sem barra. Além disso,

Drupal usa um arquivo chamado .htaccesspara dizer ao seu servidor web como lidar com URLs. Este é o mesmo arquivo que ativa a mágica de URL limpa do Drupal. Ao adicionar um comando de redirecionamento simples ao início do .htaccessarquivo, você pode forçar o servidor a remover automaticamente quaisquer barras finais.


uau, obrigado por tudo isso. Na verdade, consegui fazer funcionar, mas havia algumas coisas estranhas no meu servidor que tive que mudar. De qualquer forma, agora no próximo problema, removendo o .php de todas as páginas, exceto uma. thx man
Dirty Bird Design,

Adoro ver respostas bem pensadas e organizadas. Bom trabalho ... Uma coisa eu percebi: você quis dizer DirectoryIndex index index.html? ou DirectoryIndex index.php index.html?
Nicorellius

@nicorellius acredita que você está correto. Eu atualizei minha resposta original com sua observação.
Tim Bielawa

Devo dizer que nem sempre funciona. Tente a resposta abaixo (do usuário 1079877)
DonJoe

Você é o verdadeiro MVP.
ZainZaheer06

45

Além de outras respostas acima,

Você também pode tentar isso para remover extensões .php completamente de seu arquivo e para evitar loop infinito :

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]

Este código funcionará em Root / .htaccess. Certifique-se de alterar o RewriteBase se quiser colocá-lo em um arquivo htaccess no subdiretório.

Editar:

No apache 2.4 e posterior, você também pode usar o sinalizador END para evitar erros de loop infinito. O exemplo a seguir funciona da mesma forma que o acima no apache 2.4,

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]

10
Oi, obrigado por isso. Eu tentei muitas soluções para cortar .php, mas só funcionou corretamente :)
beamkiller

4
Obrigado! Esta edição é onde seu at, apache 2.4, apache 2.5 acabam no loop infinito (e vai 500) [END] superimportante
Jake Bolam

23

O código a seguir funciona bem para mim:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php

Isso funciona, exceto que example.com se transforma em um índice de todos os arquivos e diretórios. (Apache 2.4)
earth2jason


10

Depois de alterar o parâmetro AllowOverridedo Noneque Allem /etc/apache2/apache2.conf(Debian 8), seguindo esta , o arquivo .htaccess apenas deve conter:

Options +MultiViews
AddHandler php5-script php
AddType text/html php

E foi o suficiente para esconder a extensão .php dos arquivos


Queria que este fosse mais alto. Por que se preocupar com a sobrecarga de reescrever URL quando MultiViewsisso é pronto para uso
Phil

Isso é ótimo. Quaisquer desvantagens?
reformado em

Obrigado @reformed. Tive que mudar links de <a href="somepage.php">link </a>para <a href="somepage">link </a>no código-fonte
Rodney Salcedo

8

Tente isto
O código a seguir certamente funcionará

RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

5

Não sei por que as outras respostas não funcionaram para mim, mas este código que encontrei funcionou:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Isso é tudo o que está em meu htaccess e example.com/page mostra example.com/page.php


4

Para remover a extensão .php de um arquivo PHP, por exemplo yoursite.com/about.php para yoursite.com/about Siga estas etapas. Abra o arquivo .htaccess (crie um novo se não existir) na raiz do seu site e adicione o código a seguir.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Para remover a extensão .html de um arquivo html por exemplo seusite.com/sobre.html para seusite.com/sobre Siga estas etapas.

Abra o arquivo .htaccess (crie um novo se não existir) na raiz do seu site e adicione o código a seguir.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Referência: Como remover extensão php da URL


1
A única resposta que eu precisava. Obrigado! :)
MatrixCow08

2

Se você está codificando em PHP e deseja remover .php para ter um URL como:

http://yourdomain.com/blah -> que aponta para /blah.php

Isso é tudo que você precisa:

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

2

Achei o conceito 100% funcionando para mim:

# Options is required by Many Hosting
Options +MultiViews

RewriteEngine on

# For .php & .html URL's:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Use este código na raiz do arquivo .htaccess do seu site como:

offline - wamp \ www \ YourWebDir

online - public_html /

Se não funcionar corretamente, altere as configurações do seu servidor Wamp: 1) Clique com o botão esquerdo no ícone WAMP 2) Apache 3) Módulos Apache 4) Clique com o botão esquerdo em rewrite_module


Você não pode ter dois RewriteRules com a tag Lum ao lado do outro. [L]diz mod_rewriteque é a última regra para o especificado RewriteCond.
MD XF de

2

Aqui está o código que usei para ocultar a .phpextensão do nome do arquivo:

## hide .php extension
# To redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L,NC]

Nota: R=301é para redirecionamento permanente e é recomendado para uso para fins de SEO. No entanto, se alguém quiser apenas um redirecionamento temporário, substitua-o por apenasR


2

Acabei com o seguinte código de trabalho:

RewriteEngine on 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

1

Se o seu URL em PHP como http://yourdomain.com/demo.php que vem como http://yourdomain.com/demo

Isso é tudo que você precisa:

criar arquivo .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Funcionou, http://example.com/myfile mas não funcionou para http://example.com/myfolder/(arquivo de índice). Você pode me ajudar a fazer funcionar para o arquivo de índice?
Wesley Gonçalves

Acho que você deveria tentar o URL de resposta acima de @starkeen: stackoverflow.com/a/30566026/3786343
Kamlesh

1

Experimentar

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L] 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.