Ir al contenido

Control de rastreadores de IA (robots.txt / ai.txt)

Los proveedores de IA recorren la Web con robots identificados por nombre. Muchos consultan robots.txt para decidir qué pueden recuperar. Rankbeam incluye un catálogo mantenido y genera una robots.txt gestionada, más una ai.txt opcional, desde una política allow / disallow. Puedes permitir búsqueda y asistentes y rechazar entrenamiento.

Es una función gratuita del núcleo. Pro añade un registro de visitas de bots de IA (EN) para observar los accesos recibidos.

Política predeterminada

Cada robot tiene una finalidad principal:

FinalidadUsoPredeterminado
ai_searchRecuperar páginas para el índice de búsqueda de IAallow
ai_assistantRecuperar una página en tiempo real por petición de una personaallow
ai_trainingRecopilar contenido para entrenar un modelodisallow

La configuración inicial permite buscadores y asistentes, como los de ChatGPT Search y Perplexity, y rechaza el entrenamiento. Puedes cambiar cada decisión.

Acceso no significa cita

Permitir un rastreador hace posible la recuperación. No garantiza descubrimiento, indexación, posiciones, inclusión en respuestas, citas ni enlaces a la fuente. La política describe el acceso, no sus resultados posteriores.

Inicio rápido

Muestra primero el bloque que publicarías:

bash
php artisan seo:robots-txt --print

Puedes usarlo de dos maneras.

Opción A — añadirlo a una robots.txt existente

Si ya mantienes public/robots.txt, obtén solo el bloque gestionado y pégalo en ella:

php
use Rankbeam\Seo\Facades\SEO;

echo SEO::robotsTxt()->aiDirectives();
# --- AI crawlers (managed by Rankbeam) ---

# GPTBot — OpenAI (AI training)
User-agent: GPTBot
Disallow: /

# Bytespider — ByteDance (AI training) — advisory: this bot may not honour robots.txt
User-agent: Bytespider
Disallow: /
...

Opción B — dejar que Rankbeam gestione todo el archivo

Genera una robots.txt completa con sección general, reglas de IA, línea Sitemap: y referencia a llms.txt:

bash
php artisan seo:robots-txt          # writes public/robots.txt
php artisan seo:robots-txt --ai-txt # also write public/ai.txt

Programa el comando para seguir los cambios de política:

php
// routes/console.php
Schedule::command('seo:robots-txt')->daily();

También puedes servirlo de forma dinámica. Con seo.ai_crawlers.route = true, el paquete responde a /robots.txt desde la configuración actual, sin generar antes un archivo.

El archivo estático tiene prioridad

El servidor suele servir public/robots.txt antes de que Laravel reciba la petición. La ruta dinámica está desactivada por defecto para evitar conflictos silenciosos con un archivo olvidado. Úsala solo si no hay una robots.txt estática.

Límites de aplicación de las reglas

robots.txt expresa una petición; no es una barrera técnica. Muchos robots declaran respetarlo, pero algunos agentes activados por el usuario (ChatGPT-User, Perplexity-User) y rastreadores de entrenamiento (Bytespider) no ofrecen esa garantía. Rankbeam marca esas líneas como advisory. Para detener a un bot que no coopera, necesitas reglas del servidor o de red: firewall, WAF o reglas de bots de Cloudflare. El registro Pro (EN) ayuda a identificar visitas observadas.

Content Signals: preferencias de uso

Allow y Disallow describen el acceso. Content Signals, impulsado por Cloudflare, describe el uso deseado del contenido recuperado. Una línea Content-Signal: dentro de User-agent: * expresa tres preferencias:

SeñalFinalidad relacionadaSignificado
searchai_searchCrear un índice con enlaces y fragmentos breves
ai-inputai_assistantUsar la página como entrada de un modelo en tiempo real, por ejemplo para RAG
ai-trainai_trainingEntrenar o ajustar un modelo

Está desactivado por defecto y no cambia los bytes del archivo hasta activarlo. Rankbeam deriva entonces la línea de policy: allow pasa a yes, disallow a no.

php
'ai_crawlers' => [
    'content_signals' => true,   // env: SEO_AI_CONTENT_SIGNALS
    // ...with the default policy, this emits, in the User-agent: * group:
    //   Content-Signal: search=yes, ai-input=yes, ai-train=no
],

Si eliminas una finalidad de policy, su señal se omite. Significa que no has expresado preferencia, a diferencia de un yes o no explícito.

Preferencias, no protección técnica

Un rastreador puede ignorar Content Signals. Complementan las reglas de acceso y posibles bloqueos de red, pero no los sustituyen.

Configuración

php
// config/seo.php
'ai_crawlers' => [
    'enabled' => true,
    'route'   => false,             // serve /robots.txt dynamically (off by default)
    'disk'    => 'public',
    'path'    => 'robots.txt',
    'ai_txt_path' => 'ai.txt',

    // Policy by purpose. A purpose left out is allowed.
    'policy' => [
        'ai_training'   => 'disallow',
        'ai_search'     => 'allow',
        'ai_assistant'  => 'allow',
        'search_engine' => 'allow',   // Yandex, Baidu, Naver, Seznam, … (3.15)
    ],

    // Per-bot overrides, keyed by catalog id (win over the purpose policy).
    'overrides' => [
        'gptbot' => 'allow',          // e.g. opt GPTBot back in
        'baiduspider' => 'disallow',  // e.g. keep a search engine you don't serve off your bandwidth
    ],

    // 'blocked' = only disallowed bots get a line (lean file);
    // 'all'     = every known bot gets an explicit allow/disallow (auditable).
    'list' => 'blocked',

    // Emit a Content-Signal usage-preference line (off by default), derived
    // from `policy` above. See "Content signals" above.
    'content_signals' => false,

    // The general `User-agent: *` section: true = permissive default,
    // a string = your own rules verbatim, false = omit.
    'general' => true,

    'include_sitemap' => true,
    'sitemap_url'     => null,        // null = derive from the sitemap route
    'include_llms_txt' => true,
],

overrides reemplaza la política de finalidad para un bot concreto. Las claves son los identificadores del catálogo, como gptbot, claudebot, perplexitybot o google-extended.

Catálogo

SEO::aiCrawlers() entrega el mismo catálogo que utiliza el registro Pro para identificar visitantes. La generación de reglas y la observación comparten esa fuente.

php
SEO::aiCrawlers()->all();               // every known AiCrawler
SEO::aiCrawlers()->get('gptbot');       // one bot
SEO::aiCrawlers()->actionFor('gptbot'); // 'allow' | 'disallow' (resolved policy)
SEO::aiCrawlers()->match($userAgent);   // identify a request UA, or null

Incluye, entre otros, OpenAI (GPTBot, OAI-SearchBot, ChatGPT-User), Anthropic (ClaudeBot, Claude-SearchBot, Claude-User), Google (Google-Extended), Perplexity, Apple (Applebot-Extended), Common Crawl (CCBot), Meta, Amazon y ByteDance, con su finalidad documentada y token robots.txt.

Buscadores regionales

Desde 3.15, el catálogo incluye rastreadores de buscadores clásicos además de Google y Bing. Su finalidad es search_engine y están permitidos por defecto:

IDTokenOperador
yandexYandexYandex, Rusia; el token base cubre sus robots
baiduspiderBaiduspiderBaidu, China
yetiYetiNaver, Corea
seznambotSeznamBotSeznam, Chequia
sogouSogou web spiderSogou, China
360spider360SpiderQihoo 360, China
coccocbotcoccocbot-webCốc Cốc, Vietnam
duckduckbotDuckDuckBotDuckDuckGo

Siguen policy y overrides como los demás. Por ejemplo, 'overrides' => ['baiduspider' => 'disallow', 'sogou' => 'disallow'] les pide no recorrer el sitio. Con 'list' => 'all', cada uno recibe una regla explícita.

No aparecen en all() ni match() salvo petición expresa mediante searchEngines(), all(true) o match($ua, true). Así, el registro y los contadores de IA conservan su significado:

php
SEO::aiCrawlers()->searchEngines();          // the eight engines
SEO::aiCrawlers()->get('yandex');            // works for both lists
SEO::aiCrawlers()->match($userAgent, true);  // identify an engine too

Reconocer un robot no garantiza visibilidad ni posiciones en su buscador. Las etiquetas de verificación (yandex-verification, baidu-site-verification, naver-site-verification, seznam-wmt) se configuran bajo seo.verification; consulta contenido multilingüe.

rankbeam/laravel-seo se distribuye bajo la licencia MIT.