Cómo ocultar el.extensión html con Apache mod rewrite


Tengo un pequeño número de sitios estáticos donde simplemente quiero ocultar el .extensión html:

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

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

Suena muy simple, y he usado mod_rewrite felizmente antes (digamos con WordPress o para redirecciones), pero esto está resultando mucho más difícil de descifrar que pensé. Tal vez me estoy perdiendo algo realmente obvio, pero no puedo encontrar una solución en cualquier lugar y he estado en ello todo el día!

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

Adición

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

  1. Todas las páginas comenzaron a aparecer sin estilo. Recargé, limpié el caché, etc., pero sigue sin estilo. He tenido este problema antes, y no puedo localizar el fuente.

  2. Hay un directorio Y un archivo html llamado 'gallery', por lo que el enlace /gallery muestra una lista de directorios en lugar del archivo html. Debería ser capaz de ordenar que uno, pero más consejos bienvenidos :-)

Author: Dave Everitt, 2010-01-02

7 answers

Prueba 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.

 43
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-02 17:31:42

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

Aquí está la condición de reescritura completa que no reescribe, si la ruta solicitada es un directorio (como se indica en 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 SEO amigable y evitar el doble contenido, redirigir el.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, eche un vistazo aquí: Cómo puedo usar .htaccess para ocultar .extensiones de URL php?

 28
Author: SailAvid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:20

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

Ahí está la solución que usé:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]
 10
Author: Gael Lafond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-11 19:02:46

Mira este post http://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess / Todavía 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]
 4
Author: ashpriom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-17 04:34:17

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

RewriteEngine On
RewriteBase /
#1) externally redirect "/file.html" to "/file"
RewriteCond %{THE_REQUEST} ^[A-Z]{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]
 3
Author: starkeen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-24 03:52:28

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

foo.html.php

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

foo.html

Para que esto funcione para usted, creo que solo tendría que modificarlo un poco para que coincida con sus solicitudes existentes, y comprobar 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',
 1
Author: gahooa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-02 17:32:23

Wow, rara vez he visto un problema para el que existen tantas "soluciones" en la web, donde la gente simplemente vomita lo que "funciona para ellos", pero para el que pocos toman tiempo para leer la documentación para averiguar lo que hace. Muchas de las soluciones dadas aquí no funcionan para hosts virtuales, por ejemplo.

Después de muchas referencias cruzadas y lectura, quiero aportar mi propia solución que "funciona para mí". Espero que funcione para ti también. No lo creé desde cero; me inspiré por todas las otras contribuciones(a pesar de que la mayoría de ellos no" trabajar 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]

La bandera [R] por defecto hace una redirección temporal (302); si desea una redirección permanente, use R=301 en lugar de R.

 0
Author: Garret Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-26 23:11:55