Zum Inhalt springen

KI-Crawler steuern (robots.txt / ai.txt)

KI-Anbieter verwenden benannte Webcrawler. Viele lesen robots.txt, um zu entscheiden, welche Seiten sie abrufen dürfen. Rankbeam enthält einen gepflegten Katalog und erzeugt aus einer allow-/disallow-Richtlinie eine verwaltete robots.txt und optional ai.txt. So kannst du Crawler für KI-Suche und Assistenten zulassen und Trainingscrawler ausschließen.

Diese Funktion gehört zum kostenlosen Core. Pro ergänzt ein Zugriffsprotokoll für KI-Bots (EN), das tatsächlich beobachtete Besuche zeigt.

Standardrichtlinie

Jeder katalogisierte Bot hat einen primären Zweck:

ZweckAufgabeStandard
ai_searchSeiten für Antworten einer KI-Suche indexierenallow
ai_assistantSeiten während eines Chats im Auftrag eines Nutzers abrufenallow
ai_trainingInhalte zum Modelltraining sammelndisallow

Die Vorgabe erlaubt Suche und Assistenten, etwa hinter ChatGPT Search und Perplexity, und lehnt Training ab. Du kannst jede dieser Entscheidungen in der Konfiguration ändern.

Zugriff bedeutet keine Zitierung

Ein erlaubter Abruf macht den Zugriff möglich. Er garantiert weder Entdeckung, Indexierung, Ranking, Aufnahme in eine Antwort noch Zitate oder Quellenverweise. Die Richtlinie beschreibt den Zugriff, nicht die nachgelagerte Verwendung in Suchergebnissen.

Schnellstart

Zeige zunächst den zu veröffentlichenden KI-Crawler-Block an:

bash
php artisan seo:robots-txt --print

Du kannst ihn auf zwei Arten verwenden.

Option A — in eine vorhandene robots.txt einfügen

Wenn du public/robots.txt selbst pflegst, hole nur den verwalteten Block und füge ihn dort ein:

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: /
...

Option B — die gesamte Datei verwalten lassen

Erzeuge eine vollständige robots.txt mit allgemeinem Abschnitt, KI-Regeln, Sitemap: und einem Verweis auf llms.txt:

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

Ein Zeitplan hält die Datei mit deiner Konfiguration synchron:

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

Alternativ kannst du seo.ai_crawlers.route auf true setzen. Dann beantwortet das Paket /robots.txt dynamisch aus der aktuellen Konfiguration, ohne Generierungsschritt.

Eine statische Datei hat Vorrang

Viele Anwendungen enthalten bereits public/robots.txt. Der Webserver liefert sie aus, bevor Laravel die Anfrage erhält. Die dynamische Route ist standardmäßig deaktiviert, damit sich Route und vergessene Datei nicht unbemerkt überlagern. Verwende die Route nur ohne statische robots.txt.

Grenzen der Durchsetzung

robots.txt ist eine Aufforderung, keine Zugriffssperre. Viele katalogisierte Bots beachten sie laut ihrer Dokumentation. Bei manchen nutzergesteuerten Agenten (ChatGPT-User, Perplexity-User) und Trainingscrawlern (Bytespider) ist das nicht zugesichert. Rankbeam kennzeichnet solche Regeln als advisory. Um einen Bot tatsächlich zu sperren, brauchst du Regeln auf Server- oder Edge-Ebene, etwa Firewall, WAF oder Cloudflare-Bot-Regeln. Das Pro-Zugriffsprotokoll (EN) hilft, beobachtete Crawler zu erkennen.

Content Signals: Nutzungspräferenzen

Allow und Disallow beschreiben den Abruf. Content Signals, ein von Cloudflare unterstützter Standard, beschreiben dagegen die gewünschte Nutzung bereits abgerufener Inhalte. Eine Zeile Content-Signal: in der Gruppe User-agent: * trägt drei Präferenzen:

SignalZugehöriger ZweckBedeutung
searchai_searchSuchindex mit Links und kurzen Auszügen erstellen
ai-inputai_assistantSeiten in Echtzeit als Modelleingabe verwenden, etwa für RAG
ai-trainai_trainingModelle trainieren oder feinabstimmen

Die Funktion ist standardmäßig aus; ohne Aktivierung bleibt die Datei bytegleich. Bei Aktivierung leitet Rankbeam die Zeile aus deiner bestehenden policy ab: allow wird yes, disallow wird 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
],

Entfernst du einen Zweck vollständig aus policy, wird sein Signal weggelassen. Das bedeutet „keine Präferenz angegeben“ und unterscheidet sich von einem ausdrücklichen yes oder no.

Beratend wie robots.txt

Content Signals drücken eine Präferenz aus und erzwingen sie nicht technisch. Ein Crawler kann sie ignorieren. Sie ergänzen die Zugriffsregeln und mögliche Edge-Sperren.

Konfiguration

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,
],

Mit overrides überschreibst du die Zweckrichtlinie für einzelne Bots. Die Schlüssel sind die Katalog-IDs, zum Beispiel gptbot, claudebot, perplexitybot oder google-extended.

Katalog

SEO::aiCrawlers() liefert denselben Katalog, mit dem das Pro-Protokoll Besucher erkennt. Regelgenerierung und Besucherzuordnung verwenden damit dieselbe Grundlage.

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

Der Katalog enthält unter anderem OpenAI (GPTBot, OAI-SearchBot, ChatGPT-User), Anthropic (ClaudeBot, Claude-SearchBot, Claude-User), Google (Google-Extended), Perplexity, Apple (Applebot-Extended), Common Crawl (CCBot), Meta, Amazon und ByteDance, jeweils mit dokumentiertem Zweck und robots.txt-Token.

Regionale Suchmaschinen

Seit 3.15 enthält der Katalog auch klassische Suchcrawler außerhalb von Google und Bing. Sie haben den Zweck search_engine und sind standardmäßig erlaubt:

IDTokenBetreiber
yandexYandexYandex, Russland; das Basistoken deckt seine Bots ab
baiduspiderBaiduspiderBaidu, China
yetiYetiNaver, Korea
seznambotSeznamBotSeznam, Tschechien
sogouSogou web spiderSogou, China
360spider360SpiderQihoo 360, China
coccocbotcoccocbot-webCốc Cốc, Vietnam
duckduckbotDuckDuckBotDuckDuckGo

Sie verwenden dieselben policy- und overrides-Regeln. Beispielsweise fordert 'overrides' => ['baiduspider' => 'disallow', 'sogou' => 'disallow'] zwei Crawler auf, die Website nicht abzurufen. Mit 'list' => 'all' erhält jeder Bot eine ausdrückliche Regel.

Ohne ausdrückliche Anforderung sind Suchmaschinen nicht in all() und match() enthalten. Nutze searchEngines(), all(true) oder match($ua, true). So behalten das Pro-KI-Bot-Protokoll und Zähler für KI-Crawler ihre Bedeutung:

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

Die Erkennung eines Crawlers garantiert keine Sichtbarkeit oder Rankings. Zugehörige Verifizierungstags (yandex-verification, baidu-site-verification, naver-site-verification, seznam-wmt) stehen unter seo.verification; siehe mehrsprachige Inhalte.

rankbeam/laravel-seo steht unter der MIT-Lizenz.