Códigos útiles .htaccess para sitios web

Códigos útiles .htaccess para sitios web

27 abril, 2019 1 Por adminapuntes

El archivo .htaccess, (hypertext access), es un fichero de texto plano que se utiliza para anular la configuración del servidor (si es que este lo permite) y añadir directivas de configuración personalizadas.

A fecha de hoy la mayoría de servidores son web Apache. Es una solución mucho más barata en comparación con la plataforma IIS en Windows y más fácil de configurar para los usuarios finales. Con Apache y .htaccess, podemos controlar determinados aspectos de nuestro sitio web, incluyendo el rendimiento de nuestra página.

Por ejemplo, uno de los aspectos más usados es redirigir cualquier dominio sin www al dominio con www.. En este ejemplo, si intentas tener acceso a http://midominio.com, el servidor te redirigirá a http://www.midominio.com. Esto puede garantizar que el PageRank no se divida en dos. Para tu información, Google trata a estos dos dominios como diferentes. He aquí una guía de los códigos .htaccess que puedes utilizar en tus sitios web.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^midominio.com [NC]
RewriteRule ^(.*)$ http://www.
midominio .com/$1 [L,R=301]

Dónde localizar el fichero .htaccess

El archivo .htaccess es un archivo “oculto” indicado con el punto delante del nombre. Para poder visualizarlo debes:

  1. Accede a tu cPanel.
  2. Ve al Administrador de Archivos (te abre un diálogo y una de las opciones es “Mostrar archivos ocultos” que debe estar seleccionada).
  3. Ahí podrás localizar el archivo .htaccess (no confundir con htaccess.txt que si es visible).

Ahora que ya lo tienes claro, podemos seguir con los demás códigos que puedes utilizar en tu archivo .htaccess.

Redirigir siempre al alias www cualquier dominio apuntado

Este código es útil para redirigir uno o varios dominios para que trabajen con el alias www usando comodines * :

RewriteCond %{REQUEST_URI} !^/robots\.txt$ [NC]
RewriteCond %{HTTP_HOST} !^www\.[a-z-]+\.[a-z]{2,6} [NC]
RewriteCond %{HTTP_HOST} ([a-z-]+\.[a-z]{2,6})$ [NC]
RewriteRule ^/(.*)$ http://%1/$1 [R=301,L]

Si tenemos varios dominios gestionado en la cuenta de Hosting, para no tener que redirecciones 301 por cada uno podemos redirigir todos los .tld de los dominios utilizados “sin alias www” a dominios “con alias www”:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Redirigir url de una carpeta a otra carpeta del mismo dominio

Esto es muy útil cuando cometemos el error de indicar una carpeta nombrada de forma incorrecta o que fue renombrada más tarde. Podemos redireccionar peticiones que vayan a /carpeta1/ para que aterricen en /carpeta2/

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^carpeta1/(.*)$ http://dominio.com/carpeta2/$1 [R=301,L]

Redirigir un dominio a otro dominio

Para evitar que las urls se vean afectadas al cambiar de un dominio a otro dominio es conveniente que hagas la siguiente redirección en .htaccess de forma que quieres vengan de enlaces de la antigua url aterricen en la nueva, lo contrario afectaría al posicionamiento y habría un aumento de pérdida de tráfico.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^anteriordominio.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.anteriordominio.com$
RewriteRule (.*)$ http://www.nuevodominio.com/$1 [R=301,L]
</IfModule>

Redirigir desde localhost a un dominio remoto

Con esta regla puedes redireccionar de localhost (tu propio PC) a tu sitio web remoto (Hosting externo):

RewriteEngine On
RewriteCond %{HTTP_HOST} ^localhost$
RewriteRule (.*)$ http://www.dominio.com/$1 [R=301,L]

Si solo quieres redireccionar un subdominio concreto puedes crear la siguiente regla:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^subdominio.dominio.com$
RewriteRule (.*)$ http://www.nuevodominio.com/$1 [R=301,L]

Una forma más sencilla de hacer esto con comodines es creando una regla en .htaccess como la siguiente:

Redirect 301 (.*)$ http://www.nuevodominio.com/$1

Impedir listar el directorio

Si tienes una carpeta en el servidor web utilizada para almacenar archivos como los eBooks, software, PDFs, etc., y esta carpeta no tiene archivo index.html, los visitantes podrían ver todos los archivos dentro de la carpeta. En este caso puedes utilizar el código siguiente para evitarlo.

Options -Indexes

Orden de ejecución de archivos

Si tienes tanto el archivo index.html como el archivo index.php en la carpeta raíz , el archivo index.html tiene mayor prioridad y se ejecutará en primer lugar. Si se puede eliminar el archivo index.html, se soluciona el problema, aunque no siempre se puede hacer. En estos casos más complicados, hay una mejor solución que es utilizar el siguiente código para dar prioridad al archivo index.php en vez de index.html.

DirectoryIndex index.php index.html

Comprimir archivos CSS, JavaScript, XML y texto

El siguiente código está diseñado para comprimir el código de salida CSS, JavaScript, XML y de texto antes de ser mostrado en el navegador. La idea básica es ahorrar tiempo en la carga y no consumir tanto ancho de banda.

<ifmodule>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript
</ifmodule>

Almacenamiento en caché de imágenes

Cada vez que recibimos visitas en la web, el servidor web obtiene todos los archivos necesarios, tales como archivos CSS y JavaScript, así como fotos e imágenes para poder mostrarla. Podemos usar el código de abajo para gestionar los archivos de caché, y que cuando un visitante vuelva a visitarnos por segunda vez, el servidor cargue el archivo de la caché lo que acelerará el tiempo de carga sitio web.

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/gif A432000
ExpiresByType image/jpg A432000
ExpiresByType image/jpeg A432000
ExpiresByType image/png A432000
ExpiresByType image/ico A432000
ExpiresByType image/bmp A432000
ExpiresByType text/css A432000
ExpiresByType text/javascript A432000
ExpiresByType application/javascript A432000
ExpiresByType application/x-javascript A432000
</ifmodule>

El código anterior guarda caché de los archivos durante cinco días (expresado en segundos). Puedes cambiar el período de almacenamiento en caché, asegurándote de utilizar el valor expresado en segundos.

Proteger el archivo .htaccess

El siguiente código evita que tu archivo .htaccess puedan ser leído directamente desde el navegador web.

<Files .htaccess>
Order allow,deny
Deny from all
</Files>

Prevenir el hotlinking

A veces, otros webmasters, hacen suyas las imágenes de nuestras webs, afectando con ello el ancho de banda de que disponemos en nuestro alojamiento. Si además ellos tienen una gran cantidad de visitantes al día, estos van a utilizar nuestro ancho de banda para visualizar nuestras imágenes en la web ajena a nosotros.

Se puede utilizar el código que se muestra a continuación para evitar el hotlinking, y de esta forma reemplazar la imagen original por otra con algún aviso para hacerles saber que la imagen es nuestra o que el hotlinking es una mala práctica.

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?webempresa\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpg|gif|bmp|png)$ http://hotlink.webempresa.com/no_se_permite_hotlinking.jpg [L]

Puedes subir la imagen a un sitio de alojamiento de imágenes como ImageShack para evitar que tu ancho de banda se vea afectado.

Cambiar la ubicación de la carpeta de dominio a otra carpeta de /public_html

Si ya tienes un sitio web en /public_html, y quieres actualizar la página web, pero no quieres que los demás lo vean, pero tampoco quieres afectar al sitio web en producción existente, la forma más fácil es la construcción de la nueva página web en una subcarpeta de /public_html, por ejemplo, /public_html/web2.

Al finalizar todas las pruebas y mejoras, necesitas reemplazar el antiguo sitio web con el nuevo, pero transferir archivos y carpetas a la carpeta /public_html es bastante molesto. La mejor solución es usar.htaccess para decirle a Apache que utilice la carpeta /public_html/web2 en lugar de /public_html para el dominio.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^webempresa\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.webempresa\.com$
RewriteCond %{REQUEST_URI} !^/web2/
RewriteRule (.*) /web2/$1 [L]

Crear URLs de uso fácil o “amigables”

¿Cuál de las dos URL a continuación parece más amigable?

http://tusitio.com/acercade
http://tusitio.com/paginas/acercade.html

Cuando se trata de direcciones URL, siempre y cuando el significado sea claro, cuanto más corto es, mejor. htaccess con una llamada al módulo de Apache mod_rewrite permite configurar las direcciones URL como quieras. El servidor puede mostrar el contenido de “/paginas/acercade.html” cada vez que alguien visita “http://tusitio.com/acercade”.

A continuación algunos ejemplos:

RewriteEngine on
RewriteRule ^acercade/$ /paginas/acercade.html [L]
RewriteRule ^caracteristicas/$ /caracteristicas.php [L]
RewriteRule ^comprar/$ /comprar.html [L]
RewriteRule ^contacto/$ /paginas/contacto.htm [L]

Forzar el uso de SSL

Este código fuerza a utilizar SSL, no permitiendo conexiones http. Para evitar escuchas en http:// utilizamos por debajo la directiva ErrorDocument.

SSLOptions + StrictRequire
SSLRequireSSL

Cuando una línea comienza por # es un comentario que no tiene ningún efecto.

Si alguien visita tu sitio el servidor web Apache verifica si tiene un archivo .htaccess en algún lugar de su espacio web a partir de la carpeta raíz o la carpeta principal y rastrea todas las carpetas hasta llegar al archivo solicitado. Si encuentra un archivo .htaccess, sus directivas se aplican a la solicitud actual.

Es importante saber que el archivo .htaccess debe ser legible por el servidor Apache. Por tanto es importante consultar con su Hosting si se requiere algún permiso especial que hayan establecido para los archivos .htaccess. En general los permisos correctos para este archivo son 644.

Redireccionar de HTTP a HTTPS

Cabe decir que es necesario disponer de un Certificado SSL instalado en el Hosting para poder hacer uso de este protocolo más seguro.

RewriteEngine On
RewriteCond %{ENV:HTTPS} !on [NC]
RewriteCond %{HTTP_HOST} ^tu_dominio\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.tu_dominio\.com$
RewriteRule ^(.*)$ https://tudominio.com/$1 [R=301,L,NE]

Pueden existir casos en los que queramos añadir excepciones en el forzado de la redirección de HTTP a HTTPS (por ejemplo, la página de notificación de Redsys). Esto lo podemos hacer añadiendo una línea de código adicional. Si por ejemplo, queremos añadir una excepción para la url https://tudominio.com/?wc-api=WC_redsys habría que dejar el código anterior de la siguiente forma:

RewriteEngine On
RewriteCond %{ENV:HTTPS} !on [NC]
RewriteCond %{QUERY_STRING} !wc-api [NC]
RewriteCond %{HTTP_HOST} ^tu_dominio\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.tu_dominio\.com$
RewriteRule ^(.*)$ https://tudominio.com/$1 [R=301,L,NE]

Otro ejemplo: si no queremos forzar el uso del HTTPS para la url https://tudominio.com/blog/entrada1.html tendremos que poner un código como el siguiente:

RewriteEngine On
RewriteCond %{ENV:HTTPS} !on [NC]
RewriteCond %{REQUEST_URI} !\/blog\/entrada1\.html$ [NC]
RewriteCond %{HTTP_HOST} ^tu_dominio\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.tu_dominio\.com$
RewriteRule ^(.*)$ https://tudominio.com/$1 [R=301,L,NE]

Redireccionar de HTTPS a HTTP

Puede darse el caso que aún teniendo un Certificado SSL instalado (Comodo, Let’s Encrypt, etc) quieras forzar el tráfico encriptado SSL para que se sirva con HTTP por diversas razones (pruebas con plugins conflictivos, configuración de una pasarela pago que no trabaja bien por HTTPS, etc), en cuyo caso códigos como el siguiente te permitirán pasar de HTTPS a HTTP sin desinstalar el Certificado SSL de tu Hosting.

RewriteEngine On
RewriteCond %{ENV:HTTPS} on [NC]
RewriteCond %{HTTP_HOST} ^tu_dominio\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.tu_dominio\.com$
RewriteRule ^(.*)$ http://tudominio.com/$1 [R=301,L,NE]

Este código debes colocarlo por encima de cualquier otro código de redireccionamiento, al principio del archivo .htaccess.

Forzar la carga de contenido mixto bajo HTTPS en lugar de HTTP

Si tenemos instalado un Certificado SSL para servir la web bajo protocolo https pero por alguna razón estamos entregando contenido bajo protocolo http como contenido mixto, podemos añadir la siguiente directiva en el archivo .htaccess para forzar que los contenidos “no seguros” sean forzados a cargar bajo protocolo HTTPS.

Esta directiva es compatible con la mayoría de navegadores actuales.

<ifModule mod_headers.c>
Header always set Content-Security-Policy “upgrade-insecure-requests;”
</IfModule>

Forzar la carga de index.html

Para que un sitio HTML funcione sin añadir index.html deberías apuntar un dominio o un subdominio directamente a la carpeta que contenga la web, de modo que solo llamando a http://dominio.com o subdominio.dominio.com (por ejemplo) cargue la web HMTL sin necesidad de añadir el archivo index.html.

Si una web se llama desde una ruta como http://domino.com/otra_carpeta/ es normal que tengas que añadir el archivo index.html para que el navegador sepa que debe cargar.

No obstante puedes forzar mediante .htaccess para que cargue el archivo index.html sin tener que escribirlo en el navegador.

RewriteEngine on
RewriteRule ^(.*)\.php$ $1.html%{QUERY_STRING} [L]

Estas apenas son unas pinceladas de las muchas posibilidades que tiene la correcta gestión del archivo .htaccessque en la mayoría de sitios webs, del nivel que sean, suele pasar desapercibido y es relegado al estatus de un archivo más, cuando el potencial del mismo es tan grande como quiera otorgarle el usuario.