Vídám to na víc webech, než bych si chtěl přiznat.
Někdo chce povolit GPTBotu, ClaudeBotu nebo PerplexityBotu, aby procházeli jeho web. Tak pro každého z nich přidá blok s Allow: /.
Jejich wildcard pravidla už zakazují /admin/, /cart/, /checkout/ a pár dalších cest, které procházet nechtějí. Vypadá to správně. I člověk si to přečte jako správné.
Je to úplně špatně.
GPTBot právě dostal povolení procházet /admin/, /cart/ a všechno ostatní, co jste chtěli zablokovat.
Tohle je nejčastější chyba v robots.txt, na kterou narážím. A je čím dál nebezpečnější, protože lidé vrší pravidla pro AI crawlery na starší konfigurace, aniž by zkontrolovali, jak spolu vzájemně fungují.
Chyba, která smaže vaše wildcard pravidla
Tady je ten typ robots.txt, o kterém mluvím:
User-agent: GPTBot
Allow: /
User-agent: *
Disallow: /admin/
Disallow: /search/
Disallow: /cart/
Disallow: /checkout/
Disallow: /private/
Většina lidí to čte jako „povol GPTBotu plný přístup a navíc zablokuj tyhle cesty pro všechny“.
Jenže crawlery to takhle nečtou.
Wildcard skupina se s GPTBot skupinou nekombinuje. GPTBot čte svůj vlastní blok, vidí Allow: / bez jediného disallow a teď může volně procházet /admin/, /cart/, /private/ a všechno ostatní.
Stejná logika platí pro libovolný pojmenovaný user-agent. ClaudeBot, PerplexityBot, Bingbot. Ve chvíli, kdy botovi dáte jeho vlastní blok, ten bot přestane vaše wildcard pravidla číst úplně.
Ano, znamená to, že váš dokonale vyladěný seznam disallow v User-agent: * přestane platit pro každého pojmenovaného bota ve stejném souboru.
Přesně kvůli tomuhle vzorci jsem viděl prosakovat admin stránky, výsledky interního vyhledávání i staging adresáře. Majitel webu o tom neměl tušení. Wildcard blok vypadal důkladně.
Co specifikace ve skutečnosti říká
Tohle není otázka výkladu. RFC 9309, oficiální standard pro robots.txt od roku 2022, je v tom jednoznačné:
If no matching group exists, crawlers MUST obey the group with a user-agent line with the "*" value, if present.
Nosná část je fráze „if no matching group exists“ (pokud neexistuje žádná odpovídající skupina).
Wildcard skupina je záloha pro boty, kteří nemají vlastní blok. Není to základní vrstva, ze které by pojmenované skupiny dědily.
Dokumentace Googlu to říká ještě tvrději:
Only one group is valid for a particular crawler... Other groups are ignored. User agent specific groups and global groups (*) are not combined.
Dva nezávislé primární zdroje. Jeden mechanismus.
Crawler si vybere nejkonkrétnější skupinu, která odpovídá jeho jménu. Spustí pravidla té skupiny. Všechno ostatní v souboru ignoruje.
Na pořadí nezáleží. Žádná dědičnost, žádný fallthrough, žádný scope chain.
Takže pokud máte blok User-agent: * a blok User-agent: GPTBot, GPTBot ten wildcard blok doslova nevidí. Neví, že existuje.
Proč je to u AI crawlerů horší
U klasického Googlebota tahle chyba obvykle odhalí admin stránky a výsledky interního vyhledávání. Otravné, ale ne katastrofa. Google si s nízkohodnotnými stránkami poradí rozumně.
AI crawlery tenhle filtr nemají.
GPTBot, ClaudeBot a podobné trénovací crawlery seberou obsah a nasypou ho přímo do trénovacích datasetů. Jakmile vaše URL z interního vyhledávání skončí v trénovacím korpusu — včetně všeho, co vaši uživatelé naťukali do vyhledávání — nemáte žádný realistický způsob, jak je odtamtud dostat ven.
U OpenAI neexistuje žádná obdoba nástroje pro odstranění obsahu jako v Search Console.
Ještě horší je to ve chvíli, kdy jste pojmenované bloky přidali právě proto, abyste AI crawlery pustili dovnitř kvůli viditelnosti. Chtěli jste, aby viděli vaše blogové články a produktové stránky. Teď ale vidí i váš nákupní košík a ten staging adresář, na který jste tři migrace zpátky zapomněli.
Auditoval jsem weby, kde tahle jediná chyba vystavila AI botům tisíce interních URL.
Auditní nástroje, které většina lidí používá, to neoznačí. Syntaxe je totiž technicky validní. Dostanete zelenou fajfku na robots.txt, který přitom tiše prosakuje na všechny strany.
Mějte na paměti, že seznam AI crawlerů pořád roste. GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, Google-Extended, Applebot-Extended, Bytespider, CCBot a další.
Každé jediné z těch jmen, jakmile ho do souboru napíšete, ve výchozím stavu unikne vašemu wildcard bloku.
Jak to opravit
První otázka: potřebujete pro toho bota vůbec jiná pravidla?
Pokud má GPTBot dodržovat stejná pravidla jako všichni ostatní, žádný pojmenovaný blok nepotřebujete. Smažte ho. Wildcard se o GPTBota postará automaticky.
User-agent: *
Disallow: /admin/
Disallow: /search/
Disallow: /cart/
Disallow: /checkout/
Disallow: /private/
To je kompletní robots.txt pro případ, kdy každý bot, ať už AI nebo jiný, dodržuje stejná pravidla.
Blok pro konkrétního bota potřebujete jen tehdy, když pro toho daného bota chcete jiné chování. Zablokovat ClaudeBotu celý web, zatímco ostatní mohou procházet normálně. Zablokovat GPTBotu vaši dokumentaci, ale přitom nechat Google, ať ji indexuje pro vyhledávání. Tenhle typ věcí.
V takovém případě musí být blok pro daného bota soběstačný. Každá cesta, kterou chcete vynutit, se v něm musí zopakovat.
User-agent: ClaudeBot
Disallow: /
User-agent: GPTBot
Disallow: /admin/
Disallow: /search/
Disallow: /cart/
Disallow: /checkout/
Disallow: /private/
Disallow: /docs/
User-agent: *
Disallow: /admin/
Disallow: /search/
Disallow: /cart/
Disallow: /checkout/
Disallow: /private/
Ano, je to repetitivní. Ano, špatně se to škáluje. V robots.txt žádný mechanismus dědičnosti není.
To je známé omezení standardu.
Pokud spravujete dlouhý seznam disallow napříč mnoha boty, generujte soubor ze šablony místo ručních úprav. Jeden zdroj pravdy pro cesty pokaždé vyhraje nad copy-paste.
robots.txt vypadá jako jeden z nejjednodušších souborů v SEO výbavě. Prostý text. Pár klíčových slov. Přece se to nedá pokazit.
Dá. A vídám to neustále. Zvlášť teď, když se všichni hrnou přidávat pravidla pro AI crawlery, aniž by zkontrolovali, jak s nimi stávající pravidla interagují.
Ta chyba není překlep. Je to nepochopení toho, jak specifikace ve skutečnosti funguje.
Wildcard skupiny se nesčítají. Bloky pro konkrétní boty je přepisují celé. Každou cestu, kterou chcete blokovat, je potřeba explicitně vypsat u každého bota, kterého jste pojmenovali.
To není best practice pro robots.txt. To je přímo specifikace robots.txt.
Pokud má váš soubor jak blok User-agent: *, tak nějakého pojmenovaného bota, proveďte audit ještě dnes. Je reálná šance, že boti, které jste chtěli mít pod kontrolou, vám běhají na svobodě.
Původní verze tohoto článku je anglická. Do češtiny je přeložená automaticky.

Martin Štěpánek
Konzultant enterprise technického SEO
Jsem konzultant enterprise technického SEO a vývojář. Přes deset let jsem web stavěl, než jsem ho začal opravovat, a produkční kód píšu dodnes. Čtu odpovědi, které váš web skutečně vrací, řeknu vám, které nálezy stojí za sprint, a opravu vašim vývojářům předám sám.
Newsletter o technickém SEO, který vývojáři i SEO specialisté opravdu dočtou
Jeden konkrétní problém rozebraný do konce a jasný názor, co s ním — porovnané s primární dokumentací i s tím, co vidím v auditech. A k tomu tři zprávy z posledních dvou týdnů, vybrané a vysvětlené.



Přihlásit se k odběru
Nové vydání každé dva týdny. Odhlásíte se jedním kliknutím.
Newsletter je pouze v angličtině