Cómo ocultar la extensión .html con Apache mod_rewrite

Tengo una pequeña cantidad de sitios estáticos donde simplemente quiero ocultar la extensión .html:

  • el url /foo obtiene el archivo estático /foo.html
  • el navegador todavía muestra la url /foo

El cliente puede enviar marcadores en el estilo mydomain.com/foo lugar de mydomain.com/foo.html .

Suena muy simple, y he usado mod_rewrite felizmente antes (digamos con WordPress o para redirecciones), pero esto es mucho más difícil de descifrar que lo que pensaba. Tal vez me esté perdiendo algo realmente obvio, pero no puedo encontrar una solución en ningún lado y lo he estado haciendo todo el día.

Ejecutamos nuestro propio servidor, por lo que este puede ir a donde sea que sea el mejor lugar.

Apéndice

La solución comprobada a continuación funcionó bien. Luego, después de ejecutar el sitio por un tiempo, noté dos problemas:

  1. todas las páginas comenzaron a aparecer sin estilo. Volví a cargar, borré el caché, etc., pero sigo sin estilo. He tenido este problema antes, y no puedo encontrar la fuente.

  2. Hay un directorio Y un archivo html llamado ‘galería’, por lo que el enlace / galería muestra una lista de directorios en lugar del archivo html. Debería poder ordenarlo, pero me gustaría recibir más consejos 🙂

Pruebe esta regla:

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

Esto reescribirá todas las solicitudes que se pueden asignar a un archivo existente al agregar un .html .

Las respuestas anteriores no comprueban si la ruta solicitada es un directorio.

Aquí está la condición de reescritura completa que no se reescribe, si la ruta solicitada es un directorio (según lo indicado por la pregunta original):

 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d # is not directory RewriteCond %{REQUEST_FILENAME}\.html -f # is an existing html file RewriteRule ^(.*)$ $1.html # rewrite index to index.html 

Para ser amigable con el SEO y evitar el doble contenido, redirija las URL .html:

 # Redirects domain.com/file.html to domain.com/file RewriteCond %{REQUEST_FILENAME} !-d # is not directory RewriteCond %{REQUEST_FILENAME}\.html -f # is an existing html file RewriteCond %{REQUEST_URI} ^(.+)\.html$ # request URI ends with .html RewriteRule (.*)\.html$ /$1 [R=301,L] # redirect from index.html to index 

Si necesita lo mismo para los scripts, mire aquí: ¿Cómo puedo usar .htaccess para ocultar extensiones de URL .php?

La solución aceptada no funciona cuando el sitio web está configurado con un host virtual / raíz de documento.

Existe la solución que utilicé:

 RewriteEngine on RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.html -f RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L] 

Mira esta publicación http://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess/ Aún no lo he probado pero la demostración parece bastante convincente.

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

Para eliminar la extensión .html de las solicitudes .*.html , puede usar la siguiente secuencia de comandos en root/.htaccess :

 RewriteEngine On RewriteBase / #1) externally redirect "/file.html" to "/file" RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s([^.]+)\.html [NC] RewriteRule ^ %1 [R=301,L] #2) rewrite "/file" back to "/file.html" RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.*?)/?$ $1.html [NC,L] 

Aquí hay un ejemplo que nos permite almacenar el archivo en el disco como:

 foo.html.php 

Pero en el navegador, refiérete a él como

 foo.html 

Para que esto funcione para usted, creo que solo debería modificarlo un poco para que coincida con sus solicitudes existentes, y verifique si hay un archivo real en su lugar con la extensión .html .

  # These are so we do not need the .php extension RewriteCond %{REQUEST_FILENAME} (\.xul|\.html|\.xhtml|\.xml)$', RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.php -f', RewriteRule ^(.*)$ $1.php', 

Vaya, rara vez he visto un problema para el que existan tantas “soluciones” en la web, donde la gente simplemente vomita lo que “funciona para ellos”, pero para lo cual pocos tardan en leer la documentación para descubrir qué hace. Muchas de las soluciones proporcionadas aquí no funcionan para hosts virtuales, por ejemplo.

Después de mucha referencia cruzada y lectura, quiero contribuir con mi propia solución que “funciona para mí”. Espero que también funcione para ti. No lo creé desde cero; Me inspiraron todas las otras contribuciones (aunque la mayoría de ellas no “funcionaron para mí” sin modificaciones).

 RewriteEngine on #if foo requested, return foo.html contents RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.html -f RewriteRule ^(.*)$ $1.html [L] #redirect foo.html to foo RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d RewriteRule ^(.+)\.html$ $1 [R,L] 

El indicador [R] de forma predeterminada hace una redirección temporal (302); si desea una redirección permanente, use R=301 en lugar de R