¿Cómo bloquear una IP con .htaccess?
El archivo .htaccess es una de las herramientas más potentes disponibles para los administradores de sitios web en servidores Apache. Permite controlar con precisión el acceso a tu sitio sin tocar la configuración principal del servidor. Entre sus usos más comunes: bloquear direcciones IP no deseadas — bots maliciosos, scrapers, atacantes, o simplemente visitantes cuyo acceso deseas restringir. Aquí tienes todos los métodos disponibles, del más simple al más avanzado.
Requisitos previos: activar mod_authz_host
Las directivas de control de acceso por IP en .htaccess requieren que el módulo Apache mod_authz_host esté activado en tu servidor. Este es el caso por defecto en prácticamente todos los alojamientos compartidos y servidores Apache modernos. Si gestionas tu propio servidor, verifica con:
apache2ctl -M | grep authzTen en cuenta también que la sintaxis difiere ligeramente entre Apache 2.2 y Apache 2.4 (la versión actual). Ambas sintaxis se presentan a continuación.
Bloquear una IP única
Este es el caso más sencillo. Añade estas líneas en tu archivo .htaccess en la raíz de tu sitio:
Apache 2.4 (sintaxis actual):
<RequireAll>
Require all granted
Require not ip 123.456.789.0
</RequireAll>Apache 2.2 (sintaxis antigua):
Order Allow,Deny
Allow from all
Deny from 123.456.789.0Sustituye 123.456.789.0 por la dirección IP que deseas bloquear. El visitante recibirá un error 403 Forbidden.
Bloquear varias IPs simultáneamente
Puedes añadir tantas direcciones como necesites, listándolas en la misma línea o en líneas separadas:
Apache 2.4:
<RequireAll>
Require all granted
Require not ip 123.456.789.0
Require not ip 98.76.54.32
Require not ip 11.22.33.44
</RequireAll>Apache 2.2:
Order Allow,Deny
Allow from all
Deny from 123.456.789.0 98.76.54.32 11.22.33.44Bloquear un rango de IPs (subred)
Si necesitas bloquear un bloque entero de direcciones — por ejemplo todas las IPs de un proveedor de internet o de un centro de datos — puedes usar la notación CIDR o el prefijo de subred:
Por prefijo (todas las IPs que empiezan por 123.456.789):
<RequireAll>
Require all granted
Require not ip 123.456.789
</RequireAll>Por notación CIDR (bloque /24, es decir 256 direcciones):
<RequireAll>
Require all granted
Require not ip 123.456.789.0/24
</RequireAll>Otros ejemplos de máscaras habituales:
- /32 — una sola IP
- /24 — 256 direcciones (ej.: 123.456.789.0 a 123.456.789.255)
- /16 — 65 536 direcciones (ej.: 123.456.0.0 a 123.456.255.255)
- /8 — 16 millones de direcciones (ej.: 123.0.0.0 a 123.255.255.255)
Bloquear una IP en un directorio específico
Si deseas bloquear el acceso de una IP únicamente a un subdirectorio de tu sitio (por ejemplo tu área de administración), coloca un archivo .htaccess en ese directorio específico con la regla de bloqueo:
<RequireAll>
Require all granted
Require not ip 123.456.789.0
</RequireAll>Bueno saber: también puedes usar los bloques <Directory>, <Files> o <Location> directamente en el archivo httpd.conf o apache2.conf para un control aún más preciso — por ejemplo bloquear una IP solo en un archivo específico. Este enfoque es más eficiente que el .htaccess porque no requiere que Apache lea el archivo en cada solicitud.
Lista blanca: autorizar solo ciertas IPs
La operación inversa también es posible: permitir el acceso solo a una o varias IPs específicas y bloquear todo lo demás. Esto es especialmente útil para proteger una interfaz de administración:
Apache 2.4:
Require ip 123.456.789.0
Require ip 98.76.54.32Apache 2.2:
Order Deny,Allow
Deny from all
Allow from 123.456.789.0
Allow from 98.76.54.32Cualquier IP no listada recibirá un error 403. Ten en cuenta que si tu IP es dinámica (cambia en cada conexión), este enfoque puede bloquearte a ti mismo — en ese caso, prefiere una lista blanca por rango de subred.
Redirigir una IP bloqueada en lugar de devolver un 403
En lugar de mostrar un error 403 directo, puedes redirigir las IPs bloqueadas a otra página — una página de error personalizada o incluso otra URL:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^123.456.789.0$
RewriteRule ^ /acceso-denegado.html [R=302,L]Observa el escape de los puntos con . en la condición RewriteCond — los puntos tienen un significado especial en expresiones regulares (coinciden con cualquier carácter), por lo que deben escaparse para que solo coincidan con un punto literal.
Bloquear por User-Agent en lugar de por IP
Algunos bots maliciosos o scrapers cambian de IP regularmente pero mantienen el mismo User-Agent. En este caso, bloquear por User-Agent es más eficaz:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^(BadBot|EvilScraper|MaliciousSpider) [NC]
RewriteRule .* - [F,L]El flag [F] devuelve un error 403, [NC] hace la comparación insensible a mayúsculas/minúsculas. Puedes añadir tantos User-Agents como necesites separándolos con |.
| Caso de uso | Método recomendado | Sintaxis clave |
|---|---|---|
| Bloquear una IP única | Require not ip | Require not ip 1.2.3.4 |
| Bloquear varias IPs | Require not ip (múltiple) | Require not ip 1.2.3.4 (repetido) |
| Bloquear un rango /24 | Notación CIDR | Require not ip 1.2.3.0/24 |
| Lista blanca de IPs específicas | Lista blanca | Require ip 1.2.3.4 |
| Redirigir en lugar de bloquear | RewriteRule | RewriteCond %{REMOTE_ADDR} |
| Bloquear por User-Agent | RewriteRule + HTTP_USER_AGENT | RewriteCond %{HTTP_USER_AGENT} |
Bueno saber: los cambios realizados en el archivo .htaccess surten efecto inmediatamente en Apache, sin necesidad de reiniciar el servidor. Sin embargo, un archivo .htaccess mal formado puede hacer que tu sitio sea completamente inaccesible con un error 500. Siempre prueba los cambios en un entorno de desarrollo o guarda el archivo original antes de cualquier modificación en producción. Si tu sitio devuelve un error 500 tras la modificación, restaura inmediatamente la versión anterior del archivo.
Nicolas,