Volver a las notas

No al entrenamiento de IA, sí a la búsqueda: robots.txt por bot

19 de octubre de 2026·
robots.txtaiseocrawlers
Demo en vivoAbrir a pantalla completa

"Bloquear a los bots de IA" suena a un solo interruptor, pero no lo es. Anthropic usa tres rastreadores diferentes, uno para entrenar, otro para buscar y otro para las peticiones que hace una persona en Claude, y robots.txt puede tratar a cada uno de forma distinta. Así que puedes dejar tu contenido fuera del entrenamiento sin desaparecer de las respuestas. Hay una regla en cómo se agrupan las líneas de robots.txt que puede deshacer todo eso sin avisar, y la demo de arriba se abre justo en ella.

Tres bots, tres trabajos

El artículo de ayuda de Anthropic sobre rastreo los enumera junto con lo que pasa si desactivas cada uno:

  • ClaudeBot recoge contenido web que podría contribuir al entrenamiento. Restringirlo indica que el material futuro del sitio debe quedar excluido de sus conjuntos de datos de entrenamiento.
  • Claude-SearchBot analiza contenido para mejorar los resultados de búsqueda. Bloquearlo impide que indexen tu contenido para la búsqueda, lo que puede reducir tu visibilidad en los resultados.
  • Claude-User descarga páginas cuando alguien le pregunta algo a Claude. Bloquearlo impide que Claude recupere tu contenido para responder a esa pregunta.

Si lo que quieres es "no entrenes con mi web, pero sí cítala", el archivo es corto:

# Entrenamiento: no. Búsqueda y peticiones: sí.
User-agent: ClaudeBot
Disallow: /

User-agent: *
Disallow: /private/

Es el ejemplo "Sin entrenar, con búsqueda" de la demo. ClaudeBot tiene su propio grupo y no se lleva nada. Claude-SearchBot y Claude-User no aparecen con nombre, así que caen en el grupo * y pueden leerlo todo menos /private/.

El mismo artículo da algunas notas prácticas. El archivo tiene que estar en el directorio raíz de cada subdominio del que quieras excluirte. Bloquear las IP de Anthropic en su lugar puede no funcionar bien ni garantizar la exclusión de forma permanente, porque les impide leer tu robots.txt. También admiten la directiva no estándar Crawl-delay.

La trampa: nombrar a un bot hace que olvide *

Ahora imagina que quieres que Claude-SearchBot se centre en tu blog y le añades un grupo pequeño. Es el ejemplo "La trampa del *":

User-agent: *
Disallow: /private/

User-agent: ClaudeBot
Disallow: /

# Parece inofensivo...
User-agent: Claude-SearchBot
Allow: /blog/

Mira la columna /private/x en la demo. Claude-SearchBot ahora tiene paso permitido ahí, y la celda lleva una insignia naranja con un *. El motivo es que un rastreador sigue un solo grupo: el que lo nombra. Si existe, el grupo * se ignora por completo; no se combina con él. Su única regla dice Allow: /blog/, nada en ese grupo coincide con /private/x, y una ruta con la que no coincide ninguna regla está permitida.

No es una rareza de mi demo. El analizador de robots.txt de código abierto de Google, que su README describe como el código de producción que usa Googlebot, tiene un test para exactamente esto: con Disallow: /x/ bajo * y Disallow: /y/ bajo FooBot, FooBot puede entrar en /x/page. En el código, en cuanto ha visto un grupo para ese agente, el comparador ya no vuelve a mirar las reglas globales.

El arreglo es aburrido: repite en cada grupo con nombre las reglas de * que deban seguir aplicándose ("Trampa arreglada" en la demo).

User-agent: Claude-SearchBot
Allow: /blog/
Disallow: /private/

Cómo gana una regla

Dentro de un grupo, el orden da igual. Cada Allow y Disallow cuyo patrón coincide con la ruta es candidato, y gana el patrón más largo. Si un Allow y un Disallow miden lo mismo, gana Allow. Los patrones se anclan al principio de la ruta, * equivale a cualquier secuencia de caracteres y $ solo significa "fin de la URL" cuando es el último carácter.

Esta es la función de coincidencia que usa la demo, portada línea a línea desde robots.cc de Google. Mantiene una lista de posiciones de la ruta que todavía pueden encajar con lo leído del patrón:

function rtMatches(path, pattern) {
  const n = path.length; let pos = [0];
  for (let k = 0; k < pattern.length; k++) {
    const c = pattern[k];
    if (c === '$' && k === pattern.length - 1) return pos[pos.length - 1] === n;
    if (c === '*') { const from = pos[0]; pos = []; for (let i = from; i <= n; i++) pos.push(i); }
    else { pos = pos.filter(p => p < n && path[p] === c).map(p => p + 1); if (!pos.length) return false; }
  }
  return true;
}

rtMatches('/fish.html', '/fish');  // true: las reglas son prefijos
rtMatches('/catfish', '/fish');    // false: se ancla al principio
rtMatches('/x/y.html', '/*.html'); // true
rtMatches('/foo/bar/', '/foo/bar$'); // false: $ marca el final de la URL

La prioridad de una regla es simplemente la longitud de su patrón. Para comprobar que el port se comporta como el original, traduje a JavaScript las aserciones del archivo de tests del proyecto (robots_test.cc, que dice probar contra el RFC 9309): 151 comprobaciones sobre grupos, mayúsculas, coincidencia más larga, codificación y caracteres especiales, además de las de URL y escapado. Pasan todas con el código que lleva la demo.

Detalles que muerden

  • El token del user-agent no distingue mayúsculas; la ruta sí. User-agent: claudebot se aplica a ClaudeBot, pero Disallow: /Private/ no bloquea /private/.
  • En el token solo cuentan letras, - y _. El analizador de Google se detiene en cualquier otra cosa, así que User-agent: Foo Bar se lee como Foo. La última fila de la demo te deja escribir un token y marca los no válidos, como Googlebot/2.1.
  • Varias líneas User-agent seguidas comparten grupo. Es la forma limpia de dar a Claude-SearchBot y Claude-User las mismas reglas.
  • Un Disallow: vacío lo permite todo para ese grupo, y sigue contando como grupo con nombre, así que las reglas de * se siguen ignorando.
  • robots.txt es una petición, no un candado. Funciona cuando el rastreador lo respeta, y Anthropic dice que sus bots lo hacen. No protege contenido privado.

Qué vigilar

  • Tus propios grupos con nombre. Cada vez que alguien añade un bloque User-agent: para un bot concreto, revisa qué reglas de * acaba de perder. La demo sirve para verlo en un momento.
  • Tokens nuevos. Las empresas dividen y renombran sus rastreadores. Consulta su propia documentación para los nombres exactos en lugar de copiar la lista del robots.txt de otro.
  • Esta web. richi.codes tiene ahora mismo un único grupo User-agent: * con Allow: / (el ejemplo "richi.codes hoy"), así que cualquier bot que respete el archivo puede leerlo todo.

Fuentes