bloquear hotlinking

Bloquear hotlinking de imágenes en Nginx y Apache

Bloquear hotlinking de imágenes en Nginx y Apache

Muchos administradores se encuentran con esto tarde, cuando la factura del servidor ya ha subido sin explicación aparente. Bloquear hotlinking es una de las medidas más efectivas para proteger el ancho de banda de tu servidor y evitar que terceros se beneficien de tus recursos sin permiso. ¿En qué consiste exactamente? En que otros sitios web enlazan directamente tus imágenes desde sus páginas, de modo que tu servidor sirve el archivo cada vez que alguien visita su web. Aquí verás qué hay detrás de esta práctica, cómo detectarla y cómo bloquearla tanto en Nginx como en Apache, con configuraciones listas para aplicar.

Qué es el hotlinking y por qué perjudica a tu servidor

El hotlinking, también conocido como enlace directo o robo de ancho de banda, ocurre cuando una web externa inserta tus imágenes usando la URL completa de tu dominio —por ejemplo https://tudominio.com/wp-content/uploads/foto.jpg— en lugar de alojar el archivo en su propio servidor. El resultado: cada visita a esa web externa genera una petición HTTP contra tu servidor. No a su servidor. Al tuyo.

Las consecuencias son más graves de lo que parece a primera vista:

  • Consumo de ancho de banda: pagas la transferencia de datos de un tráfico que no beneficia en absoluto a tu sitio.
  • Sobrecarga del servidor: en servidores con recursos limitados, un sitio externo con mucho tráfico puede degradar el rendimiento de tu web.
  • Costes adicionales: en servicios con facturación por tráfico (CDN, cloud), la factura puede dispararse. Lo he visto más de una vez.
  • Problemas legales y de imagen: tu contenido aparece en webs con las que quizá no querrías asociar tu marca.

En WordPress el problema es especialmente frecuente, porque las rutas de las imágenes son predecibles y fáciles de descubrir. Cualquier web puede enlazarlas directamente sin apenas esfuerzo.

Cómo detectar si sufren hotlinking tus imágenes

Antes de bloquear nada, conviene confirmar que realmente sufres esta práctica. No vayas a disparar contra tu propio pie. Hay varias formas sencillas de comprobarlo:

Revisar los logs de acceso

Analiza los registros de Nginx o Apache buscando peticiones a tus imágenes cuyo header Referer no corresponda a tu dominio. Un comando útil en Nginx sería:

grep «jpg\|png\|webp» /var/log/nginx/access.log | grep -v «tudominio.com» | awk ‘{print $1, $7}’ | sort | uniq -c | sort -rn | head -20

Si ves muchas peticiones a ficheros de imagen desde referers ajenos, ahí lo tienes: tienes hotlinking.

Usar Google Images y herramientas online

Busca en Google Imágenes el nombre de tus archivos, o utiliza herramientas de verificación de referer en servicios de análisis. También puedes abrir una imagen tuya, copiar su URL y comprobar en webs de detección de hotlinking si aparece incrustada en otros sitios. A veces sorprende.

Vigilar métricas anómalas

  • Picos de tráfico en horas o días sin actividad en tu propia web.
  • Consumo de ancho de banda de la carpeta uploads muy superior al de las visitas reales.
  • Peticiones repetidas a las mismas URLs de imagen desde IPs muy diversas.

Cómo bloquear hotlinking en Nginx paso a paso

Nginx resuelve esto de forma elegante con el módulo ngx_http_referer_module, que permite validar el header Referer de cada petición. Tendrás que editar el bloque server o la ubicación correspondiente de tu archivo de configuración (normalmente en /etc/nginx/sites-available/ o /etc/nginx/conf.d/).

Configuración básica

Dentro del bloque server, añade lo siguiente:

location ~* \.(jpg|jpeg|png|gif|webp|svg|ico)$ {

  valid_referers none blocked tudominio.com *.tudominio.com;

  if ($invalid_referer) {

    return 403;

  }

}

¿Qué hace cada directiva?

  • location ~* \.(jpg|…)$: aplica la regla a todas las extensiones de imagen, sin distinguir mayúsculas de minúsculas.
  • valid_referers none blocked: permite peticiones sin referer (acceso directo, algunos lectores RSS) y con referer bloqueado por privacidad del navegador. Importante no olvidarlo, o romperás cosas.
  • tudominio.com *.tudominio.com: autoriza tu dominio y todos sus subdominios. Sustitúyelo por el tuyo.
  • return 403: deniega la petición si el referer no está en la lista blanca.

Mostrar una imagen sustitutoria

Si prefieres devolver una imagen alternativa en lugar de un error 403 (algunos lo hacen, con cierto gusto pícaro), puedes usar rewrite:

if ($invalid_referer) { rewrite ^/.*\.(jpg|jpeg|png|gif|webp)$ /hotlink.jpg last; }

Aplicar los cambios

Tras editar la configuración, valida y recarga Nginx:

nginx -t && systemctl reload nginx

Verifica el funcionamiento simulando una petición con curl desde un referer externo: curl -I -H «Referer: http://websajena.com» https://tudominio.com/imagen.jpg. ¿La respuesta es 403? Perfecto, el bloqueo funciona.

Cómo bloquear hotlinking en Apache con mod_rewrite y .htaccess

En Apache lo de siempre funciona: mod_rewrite y un archivo .htaccess. Pegas unas líneas en la raíz del sitio y listo. Estas son:

  1. Accede por FTP, SSH o el gestor de archivos de tu panel y edita el .htaccess (haz antes una copia de seguridad, en serio).
  2. Añade el siguiente bloque antes de las reglas de WordPress:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?tudominio\.com [NC] RewriteRule \.(jpg|jpeg|png|gif|webp|svg|mp4)$ – [F,NC,L]

Vamos por partes. La primera condición deja pasar las peticiones sin referer, porque algunos navegadores, apps y usuarios con privacidad activada no lo envían; si las bloqueas, romperás cosas sin saber por qué. La segunda excluye tu propio dominio gracias a la marca [NC] (no case-sensitive). Y la regla final devuelve un 403 Forbidden para las extensiones indicadas. ¿Prefieres mostrar una imagen alternativa en vez del 403? Sustituye el guion por la ruta: RewriteRule \.(jpg|jpeg|png|gif)$ /hotlink.jpg [R,NC,L]. Eso sí, cuidado: si la imagen sustituta coincide con las extensiones bloqueadas, crearás un bucle. Ha pasado más de una vez.

Si tu hosting usa Apache 2.4 con mod_authz_core, existe la sintaxis moderna con <If> basada en expresiones, aunque mod_rewrite sigue siendo la opción más compatible en entornos compartidos. Un detalle que se olvida a menudo: AllowOverride debe estar activado o el .htaccess no hará absolutamente nada. En servidores propios, verifica la directiva AllowOverride All en el VirtualHost.

Excepciones recomendadas: Google, redes sociales y tu propio CDN

Aquí está el error clásico. Bloquear todo sin criterio te perjudica. Google Images, Pinterest o los previews de redes sociales necesitan acceder a tus imágenes para mostrarlas, y si se las impides pierdes tráfico de referencia y visibilidad. Justo a cambio de ahorrarte unos megas. Mala operación. Añade estas excepciones junto a la condición de tu dominio:

  • Google: RewriteCond %{HTTP_REFERER} !google\. [NC]
  • Bing: RewriteCond %{HTTP_REFERER} !bing\. [NC]
  • Redes sociales: RewriteCond %{HTTP_REFERER} !facebook\. [NC] y equivalentes para twitter, pinterest y linkedin.

¿Usas un CDN tipo Cloudflare, KeyCDN o BunnyCDN? Entonces permitir su referer o dominio no es opcional: sin ello, el CDN no podrá cachear tus imágenes. La línea sería RewriteCond %{HTTP_REFERER} !\.cloudflare\. [NC]. Hay una alternativa más limpia: validar por cabecera propia del CDN (por ejemplo, %{HTTP:X-Forwarded-Host} en configuraciones personalizadas). Y en Nginx la lógica es idéntica; solo cambia que cada condición se convierte en un valid_referers adicional antes de la regla que devuelve el 403.

Prueba siempre cada excepción con curl simulando los referers permitidos antes de dar por terminada la configuración. Confiar en que «debería funcionar» no es una prueba.

Conclusión: protege tu ancho de banda sin romper tu SEO

El hotlinking es un problema silencioso: consume ancho de banda, encarece el hosting y ralentiza la web. Pero la solución importa tanto como el problema, porque unas reglas demasiado agresivas te pueden costar posiciones en Google Images y tráfico desde redes sociales. La clave está en el equilibrio. Bloquea el referer externo genérico, permite explícitamente buscadores, redes sociales y tu CDN, y prueba cada cambio con curl antes de tocar producción.

No olvides tampoco las diferencias entre servidores. En Nginx no dependes de .htaccess: cada cambio exige validar con nginx -t y recargar el servicio, mientras que en Apache basta con guardar el archivo. Combina el bloqueo de hotlinking con medidas complementarias (cabeceras Cache-Control adecuadas, protección contra escáneres de imágenes) y, si el ataque persiste, sube un escalón con reglas a nivel de firewall o WAF.

¿Prefieres que un especialista revise tu configuración o la aplique sin riesgo de dejar la web inaccesible? En RedServicio (redservicio.net) encontrarás ayuda profesional para configurar Nginx, Apache y proteger los recursos de tu sitio WordPress de forma segura.

Publicaciones Similares