¿Cómo eliminar .html de la URL?

112

¿Cómo eliminar .htmlde la URL de una página estática?

Además, necesito redirigir cualquier URL .htmla la que no la tiene. (es decir, www.example.com/page.htmla www.example.com/page).

Dave
fuente
1
Por "eliminar .html", ¿quiere decir "no es necesario que .html esté presente"?
Lightness Races in Orbit
@Tomalak: Sí y también redirigir las URL con ".html" a las que no lo tienen. Mi problema es que esto da como resultado una redirección infinita. Mi configuración actual permite que www.example.com/page.html y www.example.com/page sean accesibles, lo que no es compatible con SEO.
Dave
@Tomalak: Gracias por los consejos. Leer la documentación de mod_rewrite fue muy útil.
Dave

Respuestas:

105

Creo que alguna explicación de la respuesta de Jon sería constructiva. El seguimiento:

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

comprueba que si el archivo o directorio especificado no existe, entonces la regla de reescritura procede:

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

Pero ¿qué significa eso? Utiliza expresiones regulares (expresiones regulares) . Aquí hay algo que hice antes ... ingrese la descripción de la imagen aquí

Creo que eso es correcto.

NOTA: Al probar su .htaccess no utilice redireccionamientos 301. Utilice 302 hasta finalizar la prueba, ya que el navegador almacenará en caché 301. Ver https://stackoverflow.com/a/9204355/3217306

Actualización: estaba un poco equivocado, .coincide con todos los caracteres excepto las nuevas líneas, por lo que incluye espacios en blanco. Además, aquí hay una útil hoja de trucos de expresiones regulares

Fuentes:

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
fuente
6
Excelente diagrama para ayudar a explicar la respuesta.
Ric
El consejo sobre los 301 y la caché del navegador es lo que resolvió mis problemas.
bgfvdu3w
@KnocksX Ya no soy un webmaster y no estoy en condiciones de poder ayudar
binaryfunt
84

Para eliminar la extensión .html de sus URL, puede usar el siguiente código en 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: Si desea eliminar cualquier otra extensión, por ejemplo, para eliminar la extensión .php, simplemente reemplace el html en todas partes con php en el código anterior.

Amit Verma
fuente
10
Ninguna de las otras respuestas me funcionó, pero esta sí, ¡muchas gracias!
Emmet Arries
2
este también funcionó para mí. Gracias @starkeen. Ten un ^ voto.
JeremyS
2
Funcionó perfectamente bien. ¡Gracias!
ixany
este me quita la extensión del archivo pero no redirige a esa página
Bhargav Venkatesh
74

Con .htaccess bajo apache, puede hacer la redirección de esta manera:

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

En cuanto a la eliminación de .html de la URL, simplemente enlace a la página sin .html

<a href="http://www.example.com/page">page</a>
Jon Skarpeteig
fuente
23
Esto no hace nada por mí. ¿Hay alguna razón por la que no funcionaría?
Michael Yaworski
¿Tiene un archivo real para el enlace solicitado? Eso provocaría el!-f
Martijn
72

Esto debería funcionar para ti:

#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
fuente
3
Estaba obteniendo un 404 en Godaddy con este código y lo arreglé poniendo: Options + FollowSymLinks -MultiViews -Indexes en la parte superior.
Labanino
1
Creo que esta es la mejor y más completa respuesta, ¡gracias!
ctekk
Traté de hacer esto en localhost, pero no funciona, ¿hay alguna otra cosa que deba hacer, tengo que vincular el archivo .htaccess o cómo lo reconoce la página?
Pianistprogrammer
¿Cómo agrego la extensión .php a # 301 de example.com/page.html a example.com/page, es posible?
20

Deberá asegurarse de tener Options -MultiViewstambién.

Nada de lo anterior funcionó para mí en un host cPanel estándar.

Esto funcionó:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
Bradley Flood
fuente
De todas las respuestas anteriores, esta finalmente funcionó ... Creo que porque mi sitio está alojado en godaddy con cPanel. La clave es Opciones -MultiViews
Brad Vanderbush
Sí, nada en esta sección funciona ¡Espere esta respuesta! ¡Salvaste el día!
Neil Bannet
Gracias amigo. No estoy seguro de por qué los demás no funcionaron como se esperaba.
Nanoo
13

Gracias por tus respuestas. Ya resolví mi problema. Supongamos que tengo mis páginas en http://www.yoursite.com/html , se aplican las siguientes reglas de .htaccess .

<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
fuente
6

Utilizo este .htacess para eliminar la extensión .html de mi sitio URL, verifique que este sea el código correcto:

    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
fuente
Esto pareció funcionar para mí, a diferencia de las otras soluciones presentadas aquí, gracias. Sin embargo, agregaría que aún necesita actualizar los enlaces en su HTML (por lo tanto, si originalmente está vinculando a su archivo .html como <a href="page1.html"> </a>, debe actualizar como <a href=" example.com/page1"> </ a > y luego funcionará.)
Lorenzo
El cambio fundamental para mí fue un RewriteBase /poco. Desafortunadamente, no entiendo por qué funcionó, pero supongo que lo aprenderé pronto.
Keno Clayton
4

Para aquellos que usan el alojamiento de Firebase, ninguna de las respuestas funcionará en esta página. Porque no se puede usar .htaccessen el alojamiento de Firebase. Tendrá que configurar el archivo firebase.json. Simplemente agregue la línea "cleanUrls": trueen su archivo y guárdelo. Eso es.

Después de agregar la línea firebase.json se verá así:

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

Para eliminar la extensión .html de sus URL, puede usar el siguiente código en 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]

Gracias

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

Prueba esto :) no sé si funciona.

Jarsäter
fuente
4
No debe publicarlo como respuesta si no está seguro de si funciona o no.
¿Importa el