El archivo .htaccess es un mecanismo que usan los servidores APACHE (y otros compatibles) para alterar o configurar el funcionamiento del servidor y realizar ajustes como denegar el acceso a ciertos recursos. mejorar la seguridad, etc.
Y si lo sabes utilizar también te ayudará a realizar un mejor SEO creando direcciones URL más limpias y amigables, mejorando la velocidad de carga de tu web, realizando redirecciones 301, solucionando errores 404 y mucho más.
Precisamente debido a su gran potencia debes tener mucho cuidado si manipulas el archivo .htaccess, ya que cualquier pequeño error puede provocar problemas graves en tu sitio web o incluso impedir que se cargue.
Así que si no sabes bien lo que estás haciendo y no tienes experiencia editando este archivo, es mejor que no lo toques y que encargues la tarea a un profesional.
Como su nombre indica, y al igual que sucede con el archivo robots.txt, .htaccess es un archivo de texto plano (txt) en el cual puedes incluir direcciones específicas (las llamamos “directivas”) que tu servidor ejecutará cuando un visitante accede a tu sitio web.
El archivo siempre debe llamarse “.htaccess” tal cual y sin añadir ni quitar ningún carácter al nombre. Y debes tener cuidado de añadir el punto (“.”) delante del nombre.
Puedes tener tantos archivos .htaccess como lo necesites, ya que las directivas que indicas en cada uno de ellos se aplican al directorio donde está colocado y a todos sus subdirectorios.
La mejor forma de incluirlo en tu sitio web es subirlo mediante FTP a tu directorio principal, teniendo cuidado de realizar la transferencia en modo “ASCII” y nunca en modo “BINARIO” (BINARY), y asegúrate de que el archivo tiene permiso para ejecutarse (755).
⚠️ Si no tienes ni idea de lo que acabo de decir, no deberías tocar el archivo .htaccess.
⚠️ 🚨 MUY IMPORTANTE: los códigos de ejemplo que te proporciono en este apartado deberían funcionar correctamente, pero no puedo garantizar que haya cometido algún error y que al usarlos te causen algún problema en tu sitio web.
❗Antes de tocar nada, por favor asegúrate de que sabes cómo deshacer los cambios que vayas a realizar, haz una copia de seguridad del archivo y asegúrate de que en todo momento tienes acceso a tu servidor mediante FTP para poder restaurar la copia si es necesario.
Si tienes cualquier duda o no estás completamente seguro de lo que estás haciendo, es mejor que dejes la tarea en manos de un profesional experimentado.
Si usas WordPress es muy posible que al abrir tu fichero .htaccess compruebes que este CMS ha insertado algunas instrucciones que necesita para funcionar correctamente.
Verás algo así como esto:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
En principio no debes tocar nada de lo que aparece en este bloque porque puedes provocar que WordPress deje de funcionar correctamente o incluso que dejes de tener acceso a la instalación como administrador.
Como probablemente ya sabes una de las formas más sencillas y seguras de mejorar la velocidad de carga de cualquier sitio web es guardar copias locales de tus archivos en el caché de navegador de los usuarios.
Los navegadores modernos normalmente guardan durante un tiempo una copia de los recursos que descargan al visualizar una página web, para evitar cargarlos de nuevo cuando visitas la misma página al poco tiempo.
Uno de los recursos que más “pesa” en casi todas las páginas son las imágenes, por eso es muy conveniente instruir al navegador del usuario para que las guarde durante cierto tiempo de forma que no tenga que volverlas a cargar, lo que mejora considerablemente la velocidad de carga de la página.
Usando el archivo .htaccess puedes dar instrucciones al navegador de tus visitantes para que guarde durante cierto tiempo copias locales de tus imágenes, u otros archivos que te interese cachear, usando los módulos que se encuentren disponibles en tu servidor (no todos lo están siempre) para estas tareas.
En el siguiente ejemplo usamos mod_headers
para cachear localmente algunos tipos de archivos:
<IfModule mod_headers.c>
# Solicitamos que se cacheen estos tipos de archivo durante un mes (el tiempo se calcula en segundos)
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
# Solicitamos que se cacheen los archivos del tipo "xml" y "txt" durante dos días (el tiempo se calcula en segundos)
<FilesMatch "\.(xml|txt)$">
Header set Cache-Control "max-age=172800, public, must-revalidate"
</FilesMatch>
# Solicitamos que se cacheen estos archivos durante dos horas (el tiempo se calcula en segundos)
<FilesMatch "\.(html|htm)$">
Header set Cache-Control "max-age=7200, must-revalidate"
</FilesMatch>
</IfModule>
Y en este otro ejemplo usamos el módulo mod_deflate
para comprimir los datos y que se descarguen más rápidamente:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/javascript application/x-javascript application/json
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
</IfModule>
Gracias a .htaccess puedes conseguir que las direcciones URL de tu sitio web sean más amigables y que resulte más fácil escribirlas en el navegador, además de que también se mostrarán más “limpias”.
Por ejemplo puedes conseguir que una dirección como:
https://ninjaseo.es/seo-on-page.php
Se convierta en:
https://ninjaseo.es/seo-on-page
Para eliminar (esconder) la extensión de archivo “php” en las URLs como en el ejemplo anterior podrías usar este código:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]
En ocasiones necesitas cambiar la dirección URL de alguna página o artículo ya publicado, pero te interesa conservar el tráfico, enlaces y autoridad que ya has generado, debes hacer uso de las redirecciones del servidor como por ejemplo la 301.
Si usas WordPress lo más sencillo es usar alguno de los plugins de redireccionamiento disponibles, pero si no deseas instalar otro plugin más para esta tarea puedes hacerlo directamente usando .htaccess con este código:
RewriteEngine On
RewriteRule ^/subdirectorio-original/pagina-o-articulo-original\.?$ https://www.dominio.com/subdirectorio-nuevo/nuevo-nombre [R=301,L]
Para forzar una redirección hacia la versión segura (SSL) de tu sitio web puedes usar este código:
Si estamos usando HTTPS y queremos que solo se pueda acceder al sitio con ese protocolo:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
HSTS o HTTP Strict Transport Security es una “cabecera” de respuesta que le dice a tu navegador “oye, este sitio web usa HTTPS, así que utiliza HTTPS por defecto”.
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>
En la práctica, cuando alguien escriba directamente tu dominio, como “ninjaseo.es” o “http://ninjaseo.es/ el navegador abrirá directamente “https://ninjaseo.es”.
HSTS también aporta algunos beneficios de seguridad contra ataques “MitM” (ataque de Hombre en el Medio).
Puedes comprobar si estás usando HSTS en esta web.
Como ya sabes en la mayoría de los dominios obtienes la misma página cuando la escribes con o sin “www” delante, pero lo que tal vez no sepas es que en realidad están redirigiendo una dirección a la otra, ya que si pudieras acceder a la misma página usando dos direcciones diferentes acabarías teniendo problemas de contenido duplicado.
Para evitar estos problemas puedes usar .htaccess para redirigir las versiones con o sin www, simplemente usa el código que te interese en tu caso.
#Ejemplo 1: redirige todo el tráfico a la versión www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^ejemplo\.com [NC]
RewriteRule ^(.*)$ http://www.ejemplo.com/$1 [L,R=301,NC]
#Ejemplo 2: redirige todo el tráfico a la versión sin www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.ejemplo\.com [NC]
RewriteRule ^(.*)$ http://ejemplo.com/$1 [L,R=301]
En lugar de mostrar la página de error 404 estándar generada por tu servidor o CMS puedes indicar que se muestre cualquier página de tu elección usando este código:
ErrorDocument 404 /pagina-error.html
La seguridad de tu sitio web, y mantenerlo lo más protegido posible frente a ataque externos es muy importante, y .htaccess puede ayudarte bastante en este aspecto.
Lo primero que deberías hacer es proteger el propio archivo .htaccess para que no sea accesible y evitar que los hackers puedan leer su contenido, algo que puedes hacer con el siguiente código:
‹Files .htaccess>
Order allow, deny
Deny from all
</Files>
A continuación es una buena práctica denegar también acceso externo al archivo de configuración de WordPress:
<Files wp-config.php>
order allow, deny
deny from all
</Files>
Por último también deberías impedir que los visitantes pueda ver el contenido de los directorios de tu servidor, añadiendo esta línea:
options All - Indexes
Unos de los ataques más habituales son los que se aprovechan de las vulnerabilidades de algunos protocolos HTTP como XST (“Cross Site Tracing”) y XSS (“Cross Site Scripting”) para conseguir acceso a información protegida del servidor.
Gracias a .htaccess puede desactivar estos protocolos para evitar problemas:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F,L]
Cuando otro sitio web inserta tus imágenes en sus propias páginas está “robando” tu ancho de banda, ya que la petición de descarga se envía a tu servidor en lugar de descargarlo desde el suyo.
Afortunadamente puedes protegerte fácilmente, incluso fastidiar al “ladrón” insertando una imagen denunciando el robo cada vez que usen tus recursos:
# Deniega las peticiones de inserción de recursos que no provengan de tu propio sitio web y
# muestra una imagen de denuncia
# Cambia "dominio" por el nombre de tu dominio, y "no-robes.png" por tu imagen de denuncia
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?dominio\.com [NC]
RewriteRule \.(gif|jpg|png)$ /img/no-robes.png [R,NC]
Y si prefieres simplemente denegar el uso de tus recursos, pero no mostrar ninguna imagen en su lugar, usa este código:
# Deniega las peticiones de inserción de recursos que no provengan de tu propio sitio web
# Cambia "dominio" por el nombre de tu dominio
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?dominio\.com [NC]
RewriteRule \.(gif|jpg|png)$ - [F,NC]
No tienes ni idea de por dónde empezar, o quieres configurar más rápidamente tu archivo .htaccess?
En ese caso te aconsejo que uses esta página: Generador online del archivo .htaccess.
La página tiene una herramienta gratuita para crear archivos .htaccess de manera sencilla y rápida.
Permite configurar redirecciones, caché, páginas de mantenimiento, páginas de error personalizadas, bloqueo por IP, opciones para proteger tu web, y mucho más.