eliminar la extensión html usando el archivo htaccess

Sé que este es un tema muy común, pero ninguna de las soluciones funciona para mí. He intentado varias respuestas:

respuesta 1

respuesta 2

respuesta 3

y los enlaces de referencia.

El código htaccess que estoy usando:

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

luego cambié mis enlaces de services.html a servicios, es decir, eliminé la extensión y también eliminé la extensión del nombre del archivo usando ftp.

lo que obtengo es el código de la página que se muestra en mi navegador, no la página real.

He comprobado mod_rewrite en mi servidor y funciona correctamente con este código

 RewriteEngine On Options +FollowSymLinks RewriteRule ^joomla\.html http://www.joomla.org/? [R=301,L] 

Su archivo aún debe tener la extensión .html en el servidor, de lo contrario, el servidor / navegador no lo interpretará como html sino como texto (que es la razón por la que ve el código en su navegador). Así que cambie el nombre de los archivos en su servidor utilizando ftp nuevamente.

Para permitir que su servidor sirva el archivo /test.html cuando se accede a la url /test , quiere reescribirla internamente, es decir:

 RewriteRule ^test[^/]$ test.html 

El ^ es para coincidir con el inicio de la cadena, el $ coincide con el final, por lo que esto solo se reescribirá si la URL coincide exactamente con la test . Reescribirá esa solicitud para test.html . La reescritura es interna, esto significa que no redirigirá el navegador (la URL en la barra de direcciones no cambia). También está la reescritura externa ( [R] añadida a la regla), que redirige el navegador.

Esta regla también solo coincide con las URL que no terminan con una barra al final ( [^/] significa “no barra”). Manejaremos las URL con una barra posterior.

Puede crear un RewriteRule personalizado para cada página que desee reescribir:

 RewriteRule ^foo[^/]$ foo.html RewriteRule ^bar[^/]$ bar.html 

Esto es mucho trabajo si tiene muchas páginas, por lo que es posible que desee volver a escribir todas las URL, por ejemplo, foo o la bar debe volver a escribirse en bar.html / bar.html , y foo/bar debe volver a escribirse en foo/bar.html .

También puede usar una expresión regular para hacer coincidir todas las solicitudes. Pero primero debes comprobar si foo no es realmente un directorio (que podría contener un index.html y ser un subdirectorio al que deseas servir). También desea verificar si foo no es realmente un archivo en el sistema de archivos de su servidor. Hay dos condiciones de reescritura para verificarlo (ver la directiva RewriteCond ):

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

Ahora puede agregar una regla de reescritura para todas las solicitudes:

 RewriteRule ^(.+[^/])$ $1.html 

$1 es el contenido del primer grupo de captura, un grupo de captura en una expresión regular es una expresión colocada en () corchetes. . coincide con cualquier personaje, el modificador + significa “uno o más”.

Tenga en cuenta que esto provocaría un bucle de reescritura que daría como resultado un error de 500 ( vea esta respuesta ), por lo que también debe agregar una condición de reescritura para verificar si el archivo .html realmente existe en el sistema de archivos:

 RewriteCond %{REQUEST_FILENAME}.html -f 

Además, es posible que no desee volver a escribir las URL que ya tienen una extensión .html . No creo que sea necesario, ya que ya tiene la regla anterior que en ese caso verificaría .html.html que probablemente no debería existir. Pero si tiene que lidiar con eso, puede agregar otra condición:

 RewriteCond %{REQUEST_FILENAME} !^.+\.html$ 

Así que poniéndolo todo tu regla de reescritura se ve así:

 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f # RewriteCond %{REQUEST_FILENAME} !^.+\.html$ # not really necessary RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.+[^/])$ $1.html 

Lo único que necesita manejar ahora son las URL que tienen una barra inclinada. Para eso simplemente agregamos una regla de reescritura externa simple que elimina la barra inclinada final si la url no coincide realmente con un directorio:

 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)/$ $1 [R,L] 

Esta regla solo coincide con las URL que terminan con / (regex /$ ) y captura todo antes de la barra diagonal posterior como un grupo (regex (.+) ), Luego redirige al grupo (que no contiene la barra inclinada). Observe las banderas R y L detrás de la regla. R es para redirigir, lo que redirige al navegador (la URL en la barra de direcciones cambia). L es para el final, lo que significa que no se aplicarán otras reglas después de esta, aunque las reglas se aplicarán nuevamente después de la reescritura, y aquí es donde se aplica la otra regla.


TL; DR

 RewriteBase / # handle trailing slashes (if not a directory) RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)/$ $1 [R,L] # rewrite rule that internally adds the .html extension RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.+[^/])$ $1.html 

como @simon sugirió que el archivo correcto es:

 # handle trailing slashes (if not a directory) RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)/$ $1 [R,L] # rewrite rule that internally adds the .html extension RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}.html -f RewriteCond %{REQUEST_FILENAME} !^.+\.html$ RewriteRule ^(.+[^/])$ $1.html 

también tuve que eliminar todos los archivos de texto con el mismo nombre del servidor a través de ftp.