Como remover .html do URL?

112

Como remover .htmldo URL de uma página estática?

Além disso, preciso redirecionar qualquer url com .htmlpara aquele sem ele. (ou seja, www.example.com/page.htmlpara www.example.com/page).

Dave
fonte
1
Por "remover .html", você quer dizer "não requer que .html esteja presente"?
Lightness Races in Orbit de
@Tomalak: Sim e também redireciona os urls com ".html" para os sem. Meu problema é que isso resulta em redirecionamento infinito. Minha configuração atual permite que www.example.com/page.html e www.example.com/page sejam acessíveis, o que não é amigável para SEO.
Dave de
@Tomalak: Obrigado pelas dicas. Ler a documentação do mod_rewrite foi muito útil.
Dave

Respostas:

105

Acho que alguma explicação da resposta de Jon seria construtiva. Os seguintes:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

verifica se o arquivo ou diretório especificado, respectivamente, não existe, a regra de reescrita continua:

RewriteRule ^(.*)\.html$ /$1 [L,R=301]

Mas o que isso significa? Ele usa regex (expressões regulares) . Aqui está uma coisinha que fiz antes ... insira a descrição da imagem aqui

Eu acho que isso é correto.

NOTA: Ao testar o seu .htaccess , não use redirecionamentos 301. Use 302 até terminar o teste, pois o navegador armazenará 301s em cache. Veja https://stackoverflow.com/a/9204355/3217306

Update: Eu estava um pouco enganado, .corresponde a todos os caracteres, exceto novas linhas, então inclui espaço em branco. Além disso, aqui está uma folha de dicas de regex útil

Fontes:

http://community.sitepoint.com/t/what-does-this-mean-rewritecond-request-filename-fd/2034/2

https://mediatemple.net/community/products/dv/204643270/using-htaccess-rewrite-rules

binaryfunt
fonte
6
Diagrama excelente para ajudar a explicar a resposta.
Ric
A dica sobre o 301s e o cache do navegador foi o que resolveu meus problemas.
bgfvdu3w
@KnocksX Não sou mais um webmaster e não estou em posição de poder ajudar
binaryfunt
84

Para remover a extensão .html de seus urls, você pode usar o seguinte código em root / htaccess:

RewriteEngine on


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

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

NOTA: Se você deseja remover qualquer outra extensão, por exemplo, para remover a extensão .php, apenas substitua o html em todos os lugares por php no código acima.

Amit Verma
fonte
10
Nenhuma das outras respostas funcionou para mim, mas esta funcionou, muito obrigado!
Emmet Arries de
2
este também funcionou para mim. Obrigado @starkeen. Dê um ^ voto.
JeremyS
2
Funcionou perfeitamente bem. Obrigado!
ixany
este remove a extensão do arquivo para mim, mas não redireciona para essa página
Bhargav Venkatesh
74

Com .htaccess no apache você pode fazer o redirecionamento assim:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /$1 [L,R=301] 

Quanto à remoção de .html do url, basta criar um link para a página sem .html

<a href="http://www.example.com/page">page</a>
Jon Skarpeteig
fonte
23
Isso não faz nada para mim. Existe algum motivo pelo qual não funcionaria?
Michael Yaworski
Você tem um arquivo real para o link solicitado? Isso desencadearia o!-f
Martijn
72

Isso deve funcionar para você:

#example.com/page will display the contents of example.com/page.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

#301 from example.com/page.html to example.com/page
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.html\ HTTP/
RewriteRule ^(.*)\.html$ /$1 [R=301,L]
Łukasz Habrzyk
fonte
3
Eu estava pegando um 404 no Godaddy com esse código e corrigi colocando: Options + FollowSymLinks -MultiViews -Indexes no topo.
Labanino de
1
Acho que esta é a melhor e mais completa resposta, obrigado!
ctekk
Tentei fazer isso no localhost, mas não está funcionando. Há alguma outra coisa que eu preciso fazer, tenho que vincular o arquivo .htaccess ou como a página o reconhece?
Pianistprogrammer
Como adiciono a extensão .php a # 301 de example.com/page.html a example.com/page, é possível?
20

Você precisará ter certeza de que Options -MultiViews .

Nenhuma das opções acima funcionou para mim em um host cPanel padrão.

Isso funcionou:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
Bradley Flood
fonte
De todas as respostas acima, esta finalmente funcionou .. Acredito porque meu site está hospedado no godaddy com cPanel. A chave é Opções -MultiViews
Brad Vanderbush
Sim, nada nesta seção funciona, esperar esta resposta! Você salvou o dia!
Neil Bannet
Obrigado cara. Não sei por que os outros não funcionaram como o esperado.
Nanoo
13

Obrigado por suas respostas. Já resolvi meu problema. Suponha que eu tenha minhas páginas em http://www.yoursite.com/html , as seguintes regras de .htaccess se aplicam.

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*).html\ HTTP/
   RewriteRule .* http://localhost/html/%1 [R=301,L]

   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*)\ HTTP/
   RewriteRule .* %1.html [L]
</IfModule>
Dave
fonte
6

Eu uso este .htacess para remover .html extensões do meu site url, verifique se este é o código correto:

    RewriteEngine on
RewriteBase /
RewriteCond %{http://www.proofers.co.uk/new} !(\.[^./]+)$
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule (.*) /$1.html [L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.html\ HTTP
RewriteRule ^([^.]+)\.html$ http://www.proofers.co.uk/new/$1 [R=301,L]
Anmol
fonte
Isso pareceu funcionar para mim, ao contrário das outras soluções apresentadas aqui, obrigado. No entanto, eu acrescentaria que você ainda precisa atualizar o (s) link (s) em seu HTML (então, se você originalmente está vinculando ao seu arquivo .html como <a href="page1.html"> </a>, você deve atualizar como <a href=" example.com/page1"> </ a > e então funcionará.)
Lorenzo
A mudança fundamental para mim foi o RewriteBase /bit. Infelizmente não entendo por que funcionou, mas acho que aprenderei em breve.
Keno Clayton
4

Para quem usa o Firebase hosting, nenhuma das respostas funcionará nesta página. Porque você não pode usar .htaccessno Firebase hosting. Você terá que configurar o arquivo firebase.json. Basta adicionar a linha "cleanUrls": trueem seu arquivo e salvá-lo. É isso aí.

Depois de adicionar a linha firebase.json ficará assim:

{
  "hosting": {
    "public": "public",
    "cleanUrls": true, 
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
HarsH
fonte
2

Para remover a extensão .html de seus URLs, você pode usar o seguinte código em root / htaccess:

#mode_rerwrite start here

RewriteEngine On

# does not apply to existing directores, meaning that if the folder exists on server then don't change anything and don't run the rule.

RewriteCond %{REQUEST_FILENAME} !-d

#Check for file in directory with .html extension 

RewriteCond %{REQUEST_FILENAME}\.html !-f

#Here we actually show the page that has .html extension

RewriteRule ^(.*)$ $1.html [NC,L]

obrigado

Akash Limbani
fonte
-1
RewriteRule /(.+)(\.html)$ /$1 [R=301,L] 

Experimente :) não sei se funciona.

Jarsäter
fonte
4
Você não deve postar como uma resposta se não tiver certeza se funciona ou não.
Faz diferença