Bloquea bots en tus sitios web usando Nginx
Si tienes una web (sea e-commerce, site-blog, newsletter, etc...) de cualquier tipo y tienes un mínimo de tráfico, seguramente tendrás miles y miles de peticiones que vienen de bots y que están sobrecargando tu máquina.
Aquí es importante diferenciar qué bots "compensan" y cuales no. Me explico!
Si tengo mi sitio web y veo que tengo un montonazo de peticiones por parte del bot de Google "Googlebot", tengo una penalización de rendimiento PEEEERO es importante que no lo bloquee porque está indexando todos mis contenidos y en el fondo me compensa porque así consigo que "google me conozca"
En mi caso, y siendo un caso bastante genérico, los bots que están orientados a indexación de buscadores los veo bien y creo que compensa la penalización en relación al beneficio; ahora si, los bots orientados a scrapping y IA... bloqueados todos de momento ya que no hay beneficio aún!
Vamos al lio! Para hacer este bloqueo me centro en Nginx porque es donde más cómodo me siento y es lo que más trabajo. Lo he vamos a ver es como bloquear los bots en tus sitios web configurados en nginx.
PASO1: NGINX.conf
Como quiero que la config sea global, modificamos le fichero /etc/nginx/nginx.conf añadimos esto:
http {
# Aquí habrá más config genérica
.
.
#Tenemos dos filtros. Uno para los "bots malos que no nos hacen bien"
map $http_user_agent $is_bad_bot {
default 0;
~*(GPTBot|ChatGPT|ChatGPT-User|CCBot|Amazonbot|Bytespider|ClaudeBot|Anthropic|Google-Extended|BingPreview|AhrefsBot|SemrushBot|MJ12bot|DotBot|Scrapy) 1;
}
# Un segundo filtro en el que podemos filtrar bots que si que nos hacen bien pero lo bloqueamos igual
map $http_user_agent $is_bot {
default 0;
~*(bingbot) 1;
}
.
.
.
}
Estes filtros lo que hacen es saber si la petición que acaba de entrar es de un bot o no en base al "user-agent" de la petición
PASO2: SITE-CONF
Ya tenemos esos filtros configurados por lo que los podremos usar en todos nuestros sitios que tengamos configurados en nuestro server.
Vamos a meterlo en un sitio que sea un Drupal para hacer referencia a mi caso claro! :)
server {
# Aquí estará toda la config de su server
.
.
.
# Cualquier petición que procesemos metelos el filtro de bots "malos"
location / {
# Si entra el filtro => 403 y bloqueamos peticion
if ($is_bad_bot) {
access_log off;
return 403;
}
try_files $uri /index.php?$query_string;
}
# SI tenemos una demasiado dinámica podemos añdir también este filtro para quitar algunos bots extra
location /mi-url-dinamica {
if ($is_bot) {
access_log off;
return 403;
}
try_files $uri /index.php?$query_string;
}
.
.
.
}
Y hasta aqui! DONE :D