Nuestra postura: somos Geonode y vendemos proxies a personas que recopilan datos, por lo que robots.txt se sitúa directamente en el centro del trabajo de nuestros clientes. Lo cierto es que cumplirlo te beneficia a ti, no solo al sitio web. Un rastreador que respete el archivo, se identifique y regule su ritmo es uno que los operadores del sitio pueden decidir permitir. Un rastreador que lo ignore es una molestia que hay que bloquear, y bloquearlo les sale barato a ellos y caro a ti. También queremos dejar claro lo que dice la propia norma al respecto: el RFC establece claramente que estas reglas «no son una forma de autorización de acceso», por lo que respetar robots.txt es necesario pero no suficiente, y las condiciones de servicio son una cuestión aparte.
Qué es y qué no es el archivo robots.txt
La propia definición del RFC es la más clara que existe:
Puede resultar inconveniente para los propietarios de servicios que los rastreadores visiten la totalidad de su espacio URI. Este documento especifica las reglas definidas originalmente por el «Protocolo de exclusión de robots» que se solicita a los rastreadores que respeten al acceder a las URI.
Estas reglas no constituyen una forma de autorización de acceso.
Esa última frase tiene un doble significado. Por un lado, implica que una ruta no permitida no está protegida —nada hace cumplir la regla—; y, por otro, significa que una ruta permitida no está, por ello, autorizada, ya que el permiso proviene de los términos y la legislación, y no de un archivo de texto.
La sección sobre seguridad deja clara la primera parte y merece la pena citarla, ya que mucha gente lo entiende al revés:
El Protocolo de Exclusión de Robots no sustituye a las medidas válidas de seguridad del contenido. Incluir rutas en el archivo robots.txt las expone públicamente y, por lo tanto, hace que sean localizables.
Así pues, Disallow: /admin/secret-reports/ le dice al mundo que esa ruta existe. Si estás redactando un archivo «robots.txt», ese es un argumento para no incluir en él ninguna ruta sensible; utiliza la autenticación, tal y como recomienda explícitamente el RFC.
El formato
Un archivo es una secuencia de grupos. Cada grupo comienza con una o más líneas «user-agent» y va seguido de reglas.
User-agent: *
Disallow: /admin/
Disallow: /search?
Allow: /search/help
User-agent: BadBot
Disallow: /
Sitemap: https://example.com/sitemap.xml
Tres caracteres especiales que los rastreadores DEBEN admitir:
| Carácter | Significado | Ejemplo |
|---|---|---|
# | Comentario de línea | allow: / # comment in line |
$ | Fin del patrón de coincidencia | allow: /this/path/exactly$ |
* | Cero o más caracteres cualesquiera | allow: /this/*/exactly |
Un grupo vacío al final tiene significado: el RFC señala que «el último grupo puede no tener reglas, lo que significa que permite implícitamente todo». Por lo tanto, un User-agent: quxbot al final sin nada debajo concede a ese rastreador acceso sin restricciones.
Un Disallow: vacío sin ruta también significa que todo está permitido; es la forma convencional de decir «sin restricciones».
Sitemap: no forma parte de la gramática básica. La ABNF del RFC incluye una nota dirigida a los implementadores para que «definan las líneas adicionales que necesiten (por ejemplo, los mapas de sitio)», por lo que se trata de una extensión ampliamente compatible más que de una característica obligatoria. Crawl-delay se encuentra en la misma categoría: es habitual, muchos rastreadores la respetan y no forma parte del estándar.
Cómo funciona la coincidencia del User-Agent
Es más específico de lo que la mayoría de la gente cree, y merece la pena entenderlo bien.
El token es una subcadena de tu encabezado User-Agent. El ejemplo del RFC: un encabezado de Mozilla/5.0 (compatible; ExampleBot/0.1; https://www.example.com/bot.html) se corresponde con una línea robots.txt de user-agent: ExampleBot, y señala que «el token del producto (ExampleBot) es una subcadena del encabezado HTTP User-Agent».
La coincidencia no distingue entre mayúsculas y minúsculas. «Los rastreadores DEBEN utilizar la coincidencia sin distinción entre mayúsculas y minúsculas para encontrar el grupo que coincida con el token del producto y, a continuación, acatar las reglas de dicho grupo».
Los grupos de coincidencia múltiples se fusionan. «Si hay más de un grupo que coincida con el User-Agent, las reglas de los grupos coincidentes DEBEN combinarse en un único grupo». Así pues, dos bloques «User-agent: ExampleBot» separados en el mismo archivo dan lugar a un único conjunto de reglas combinado, en lugar de que el segundo anule al primero.
Se obtiene un único grupo, no varios. Si un grupo incluye tu token, debes utilizar ese grupo e ignorar por completo el grupo «*»: el comodín es una opción de reserva, no una base a la que se añadan reglas específicas. Esto sorprende a la gente: un rastreador con su propio grupo no está sujeto además a las reglas generales.
Y si no hay ninguna coincidencia: «Si ningún grupo coincide con el token del producto y no hay ningún grupo con una línea de agente de usuario con el valor *, o si no hay ningún grupo, no se aplica ninguna regla».
La coincidencia se basa en la especificidad, no en el orden
La regla que más se malinterpreta en todo este ámbito.
Para evaluar si se permite el acceso a un URI, un rastreador DEBE comparar las rutas de las reglas «allow» y «disallow» con el URI. La coincidencia DEBERÍA distinguir entre mayúsculas y minúsculas. La coincidencia DEBE comenzar por el primer octeto de la ruta. DEBE utilizarse la coincidencia más específica que se encuentre. La coincidencia más específica es aquella que tiene más octetos.
No gana la primera coincidencia. Tampoco gana la última. Gana la coincidencia más larga.
El propio ejemplo del RFC:
User-Agent: foobot
Allow: /example/page/
Disallow: /example/page/disallowed.gif
Para example.com/example/page/disallowed.gif, la línea Disallow es más larga, por lo que se aplica —a pesar de aparecer en segundo lugar y de que una regla Allow cubra la ruta principal.
Si se invierte el orden en el archivo, nada cambia. El orden es irrelevante.
Dos reglas más completan el panorama. En caso de empate, se aplica «Allow»: «Si una regla de “permisión” y una de “denegación” son equivalentes, DEBERÍA utilizarse la regla de “permisión”». Y la ausencia de coincidencia implica permiso: «Si no se encuentra ninguna coincidencia entre las reglas de un grupo para un agente de usuario concreto, o si no hay reglas en el grupo, el URI está permitido».
Otro detalle que conviene saber: «El URI /robots.txt está implícitamente permitido», por lo que un archivo que lo prohíbe todo no se prohíbe a sí mismo.
La coincidencia de rutas también implica la normalización mediante codificación porcentual. Los octetos fuera del ASCII y los que se encuentran en el rango reservado «DEBEN codificarse en porcentaje» antes de la comparación, y un octeto ASCII codificado en porcentaje en la URI «DEBE descodificarse antes de la comparación», a menos que esté reservado. En la práctica: utiliza una biblioteca actualizada en lugar de escribir esto tú mismo.
Los códigos de estado lo cambian todo
Las reglas en este ámbito son precisas, se ignoran con frecuencia y la diferencia entre dos de ellas es considerable.
Éxito. «Si el rastreador descarga correctamente el archivo robots.txt, DEBE seguir las reglas que se puedan analizar».
Redirigencias. «Los rastreadores DEBERÍAN seguir al menos cinco redireccionamientos consecutivos, incluso entre dominios distintos». Un archivo al que se acceda tras cinco redireccionamientos «DEBE recuperarse, analizarse y deben seguirse sus reglas en el contexto del dominio inicial». Más allá de cinco, un rastreador «PUEDE suponer que el archivo robots.txt no está disponible».
No disponible — 4xx. «Si un código de estado del servidor indica que el archivo robots.txt no está disponible para el rastreador, este PUEDE acceder a cualquier recurso del servidor». Un 404 significa que no hay restricciones.
Inaccesible — 5xx. Este es el que la gente suele malinterpretar: «Si no se puede acceder al archivo robots.txt debido a errores del servidor o de la red, esto significa que el archivo robots.txt no está definido y el rastreador DEBE asumir una prohibición total».
Un 5xx significa detener por completo. No «seguir como antes», ni «utilizar la copia en caché indefinidamente», sino una prohibición total. El RFC sí permite una excepción a largo plazo: si el archivo no está definido «durante un periodo de tiempo razonablemente largo (por ejemplo, 30 días), los rastreadores PUEDEN suponer que el archivo robots.txt no está disponible… o seguir utilizando una copia en caché».
Errores de análisis. «Los rastreadores DEBEN intentar analizar cada línea del archivo robots.txt. Los rastreadores DEBEN utilizar las reglas que puedan analizarse». Una línea mal formada no invalida el archivo; se utiliza lo que se puede leer.
La implicación práctica para cualquiera que escriba un rastreador: una interrupción temporal en el sitio de destino debería detener el rastreo, no acelerarlo. Entenderlo al revés significa sobrecargar un sitio que ya está pasando apuros.
Almacenamiento en caché y límites
Dos requisitos operativos que suelen plantear problemas a las implementaciones propias.
Actualizar al menos una vez al día. «Los rastreadores PUEDEN almacenar en caché el contenido del archivo robots.txt obtenido... Los rastreadores NO DEBEN utilizar la versión almacenada en caché durante más de 24 horas, a menos que no se pueda acceder al archivo robots.txt».
Recuperar el archivo una sola vez al iniciar el rastreador y dejarlo en ejecución durante una semana no cumple con las normas. Los sitios web cambian sus reglas, y una tarea de larga duración debe detectarlo.
Analizar al menos 500 KiB. «El límite de análisis DEBE ser de al menos 500 kibibytes». Los sitios web grandes tienen archivos grandes, y un analizador que corte el análisis a un tamaño arbitrariamente menor omitirá reglas de forma silenciosa —lo cual es el peor modo de fallo posible en este caso, ya que da lugar a un rastreador que cree que cumple con los requisitos cuando en realidad no es así.
Lectura de un archivo real
Analizamos un ejemplo práctico.
User-agent: *
Disallow: /search
Allow: /search/about
Disallow: /*?sessionid=
Disallow: /*.pdf$
Crawl-delay: 2
User-agent: GPTBot
Disallow: /
User-agent: PartnerBot
Disallow:
Sitemap: https://example.com/sitemap_index.xml
Línea por línea:
**Disallow: /search
** bloquea /search
, /search/
, /search/results
— cualquier cosa que comience con esa cadena, ya que la coincidencia comienza en el primer octeto y no hay $
.
**Allow: /search/about
** es más largo, por lo que prevalece para esa ruta específica. Prevalece la coincidencia más larga, no el orden.
**Disallow: /*?sessionid=
** utiliza el comodín para bloquear cualquier ruta que contenga un parámetro de sesión, independientemente de lo que le preceda.
**Disallow: /*.pdf$
** bloquea las URL que terminan en .pdf
. Sin el $
, también bloquearía /report.pdf.html
.
**Crawl-delay: 2
** es una extensión más que un estándar, y respetarla es una buena práctica.
**User-agent: GPTBot
con Disallow: /
** excluye por completo a ese rastreador. Ten en cuenta que a GPTBot solo se le aplica esta regla; no está sujeto al grupo *
, por lo que el Crawl-delay
anterior no se le aplica.
**User-agent: PartnerBot
con un Disallow:
vacío** concede acceso sin restricciones.
**Sitemap:
** apunta al inventario de URL, que es la línea más útil de forma inmediata en la mayoría de los archivos. Ya explicamos qué hacer con ella en cómo encontrar todas las páginas de un sitio web.
Cómo respetarlo en el código
Utiliza un analizador sintáctico actualizado. La regla de coincidencia de especificidad por sí sola es una fuente habitual de errores, y la normalización mediante codificación porcentual es aún peor.
Python: urllib.robotparser está en la biblioteca estándar y es adecuado para casos sencillos; el analizador de código abierto de Google robotstxt y sus enlaces para Python implementan el RFC 9309 con precisión. Scrapy tiene RobotsTxtMiddleware integrado y habilitado por defecto en los nuevos proyectos; comprueba que nadie lo haya desactivado.
Node: varios paquetes mantenidos implementan el estándar.
Go: existen bibliotecas que siguen las reglas de coincidencia del RFC.
Utilices lo que utilices, asegúrate de hacer bien estas cuatro cosas:
Actualiza cada 24 horas, no solo una vez al iniciar. Considera los códigos 5xx como una prohibición total y los 404 como ausencia de restricciones. Realiza la coincidencia con tu token de producto real y asegúrate de que tu encabezado User-Agent lo contenga. Sigue hasta cinco redireccionamientos, aplicando las reglas en el contexto del host original.
Y una quinta regla que no figura en el RFC, pero que es igual de importante: registra lo que has omitido. Un rastreador que excluye silenciosamente la mitad de un sitio web debido a una regla que no esperabas es aquel en el que los datos que faltan se descubren semanas más tarde cuando alguien pregunta por qué un informe parece incorrecto.
Lo que no cubre el archivo robots.txt
Vale la pena ser explícito, porque la gente tiende a malinterpretarlo en ambos sentidos.
No dice nada sobre lo que se puede hacer con los datos que se recogen. Los derechos de autor, los derechos sobre las bases de datos y las condiciones de servicio se aplican de forma independiente.
No es un permiso. El RFC lo dice claramente. Una ruta permitida es aquella que el sitio web no ha pedido a los rastreadores que eviten, lo cual no equivale a un consentimiento para la recopilación masiva.
No establece ningún límite de frecuencia en el estándar. Crawl-delay es una extensión. Ser educado depende de ti.
No distingue entre fines. Un archivo no puede indicar «sí a la indexación, no al entrenamiento de IA» en la sintaxis estándar, aunque muchos sitios web se acercan ahora a esto nombrando tokens específicos para rastreadores de IA. El marco de la UE sobre minería de textos y datos contempla reservas de derechos legibles por máquina, y los mecanismos para expresarlas aún se están definiendo.
No puede impedir que nadie lo haga. Se trata de una solicitud. La aplicación consiste en la limitación de la frecuencia, el bloqueo y los procedimientos legales; esta es la razón práctica por la que un operador opta por permitir un rastreador en lugar de tener que impedirlo.
Preguntas frecuentes
¿Es el archivo robots.txt legalmente vinculante?
No en sí mismo. El RFC 9309 establece que sus normas «no constituyen una forma de autorización de acceso», sino una solicitud que se pide a los rastreadores que respeten. Las obligaciones legales derivan de las condiciones de servicio, los derechos de autor, los derechos sobre bases de datos y la legislación específica de cada jurisdicción, todas las cuales se aplican independientemente de lo que diga el archivo.
¿Se aplican las reglas del archivo robots.txt por orden?
No, y este es el error más común al respecto. La especificación exige que «DEBE utilizarse la coincidencia más específica encontrada», donde «más específica» significa el mayor número de octetos. Prevalece la coincidencia más larga; el orden es irrelevante, y en caso de empate, se aplica «Allow».
¿Qué ocurre si el archivo robots.txt devuelve un error 404?
El archivo «no está disponible», y el RFC establece que el rastreador «PUEDE acceder a cualquier recurso del servidor». La ausencia de archivo implica que no hay restricciones. Esto es diferente de un error del servidor.
¿Qué ocurre si el archivo robots.txt devuelve un código 500?
El archivo es «inaccesible» y está sin definir, y el rastreador «DEBE asumir una prohibición total». Un error del servidor implica detenerse por completo, no continuar. Tras un largo periodo —el RFC sugiere 30 días—, un rastreador puede tratarlo como no disponible o seguir utilizando una copia en caché.
¿Con qué frecuencia debo recuperar el archivo robots.txt?
Al menos cada 24 horas. El RFC establece que los rastreadores «NO DEBERÍAN utilizar la versión en caché durante más de 24 horas, a menos que el archivo robots.txt sea inaccesible». Recuperarlo una vez al iniciar el sistema y utilizarlo durante una semana no cumple con las normas.
¿Un grupo de user-agent específico anula al grupo comodín?
Lo sustituye. Si un grupo nombra el token de tu producto, debes seguir ese grupo e ignorar por completo el grupo «*»; las reglas específicas no se suman a las generales. Dos grupos que nombren el mismo token se fusionan en uno solo.
¿Qué significan «*» y «$» en el archivo robots.txt?
«*» coincide con cero o más caracteres cualesquiera, y «$» marca el final del patrón de coincidencia. Ambos son caracteres que los rastreadores DEBEN admitir. «Disallow: /*.pdf$» bloquea las URL que terminan en «.pdf»; sin el «$» también bloquearía «/file.pdf.html».
¿Puedo utilizar el archivo robots.txt para ocultar páginas confidenciales?
No, y hacerlo empeora las cosas. La sección de seguridad del RFC señala que «incluir rutas en el archivo robots.txt las expone públicamente y, por lo tanto, hace que sean localizables». Cualquiera puede leer el archivo. Utiliza la autenticación, que es lo que recomienda explícitamente la especificación.
Conclusión: «
robots.txt» es breve, está estandarizado y se aplica habitualmente de forma incorrecta. La mayoría de los errores se deben a tres reglas.
Gana la coincidencia más larga, no la primera ni la última. Un «Disallow» que aparezca más abajo en el archivo puede anular un «Allow» que esté por encima, y viceversa, únicamente por su longitud. Un código 5xx significa rechazo total, lo cual es lo contrario de lo que hace una implementación intuitiva: un sitio con problemas debería recibir menos tráfico por tu parte, no la misma cantidad. Y el archivo debe actualizarse al menos una vez al día, porque los sitios cambian de opinión y una copia en caché de hace una semana no cumple con los requisitos.
Utiliza un analizador sintáctico actualizado en lugar de escribir uno propio, asegúrate de que tu encabezado User-Agent contenga realmente el token con el que esperas que se realice la coincidencia, y registra lo que has omitido para que la falta de datos sea una decisión y no una sorpresa.
Y ten en cuenta la propia advertencia de la norma. Estas reglas «no constituyen una forma de autorización de acceso»: cumplirlas te convierte en un rastreador con el que un operador puede convivir, pero no resuelve las cuestiones independientes de lo que permiten los términos y de lo que puedes hacer con lo que recopilas.
