htaccess - Cómo ocultar la extensión.html con Apache mod_rewrite
rewriterule flags (7)
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'',
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:
todas las páginas comenzaron a aparecer sin estilo. Recargué, borré el caché, etc., pero todavía no tengo estilo. He tenido este problema antes, y no puedo encontrar la fuente.
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 :-)
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]
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?
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} ^[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]
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
.
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