Как разрешить или заблокировать ИИ-ботов в robots.txt

Большинство сайтов решают этот вопрос один раз, плохо, и больше к нему не возвращаются. Либо в панике из-за обучения закрывают всё подряд, заодно отрезая трафик, который приводит клиентов, либо не настраивают ничего, и работает то, что краулер сам себе домыслил.

Разумных позиций три. Вот файл для каждой и ошибки, которые их обнуляют.

Сначала различие, от которого зависит всё

У ИИ-компаний два типа агентов, и они не взаимозаменяемы.

Краулеры собирают страницы пачками, по своему расписанию, обычно для обучения или индекса: GPTBot, ClaudeBot, PerplexityBot, CCBot, Bytespider, Google-Extended, Applebot-Extended.

Загрузчики по запросу забирают одну страницу, потому что человек только что о ней спросил: ChatGPT-User, Claude-User, Perplexity-User. На этом запросе никто ничего не обучает. Кто-то ждёт ответа про вас.

Закрыть первых — деловое решение о своём контенте. Закрыть вторых — почти то же самое, что не пустить посетителя, который вручную набрал ваш адрес. Почти все советы в духе «блокируй весь ИИ» между этими двумя группами разницы не делают.

Случай 1 — Пустить

Правильное значение по умолчанию для всего, что хочет быть найденным: документация, издания, которым нужна ссылка на источник, бизнесы, которых хотят рекомендовать.

User-agent: *
Allow: /
Disallow: /admin/
Disallow: /cart/
Disallow: /*?session=

Content-Signal: search=yes, ai-input=yes, ai-train=no

Sitemap: https://example.ru/sitemap.xml

Прочитайте, что здесь написано: заходи, индексируй меня, используй меня в ответах, но не обучайся на мне. Такую позицию один robots.txt выразить не умеет — отсюда раздел про Content-Signal ниже.

Случай 2 — Ответы да, обучение нет

Та самая позиция, которой на деле хочет большинство компаний, и та, которую почти никто не настраивает правильно.

User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: Bytespider
Disallow: /

User-agent: Google-Extended
Disallow: /

User-agent: Applebot-Extended
Disallow: /

User-agent: OAI-SearchBot
Allow: /

User-agent: Claude-SearchBot
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: ChatGPT-User
Allow: /

User-agent: Claude-User
Allow: /

User-agent: Perplexity-User
Allow: /

User-agent: *
Allow: /

Content-Signal: search=yes, ai-input=yes, ai-train=no

Sitemap: https://example.ru/sitemap.xml

Про этот файл стоит знать две вещи. Google-Extended управляет обучением Gemini, а не поиском Google: закрыв его, вы ничего не теряете в выдаче. И Applebot-Extended работает так же для Apple Intelligence, отдельно от Applebot, который питает Siri и Spotlight.

Случай 3 — Закрыть ИИ полностью

Оправданно для платных архивов, лицензионных материалов и всего, доступ к чему вы продаёте.

User-agent: GPTBot
User-agent: OAI-SearchBot
User-agent: ChatGPT-User
User-agent: ClaudeBot
User-agent: Claude-SearchBot
User-agent: Claude-User
User-agent: PerplexityBot
User-agent: Perplexity-User
User-agent: CCBot
User-agent: Bytespider
User-agent: Google-Extended
User-agent: Applebot-Extended
User-agent: Amazonbot
User-agent: meta-externalagent
Disallow: /

User-agent: *
Allow: /

Content-Signal: search=no, ai-input=no, ai-train=no

Sitemap: https://example.ru/sitemap.xml

Составленные подряд строки User-agent делят между собой правила, идущие следом. Это допустимо и куда проще в сопровождении, чем четырнадцать отдельных блоков.

Оцените цену, прежде чем выбирать это: вы исчезаете из ответов ИИ. Когда кто-то спросит ассистента про вашу отрасль, названы будут конкуренты, а вы нет.

Ошибки

Применяется только самая конкретная группа. Краулер, нашедший своё имя, полностью игнорирует User-agent: *. Так что вот это работает не так, как кажется:

User-agent: *
Disallow: /private/

User-agent: GPTBot
Disallow: /

GPTBot закрыт везде, но любой другой бот читает только группу * — а если завтра вы добавите Allow под GPTBot, /private/ перестанет быть от него защищён, потому что в той группе /private/ никогда не упоминался.

Пустые строки разделяют группы. Пустая строка в середине группы её заканчивает. То, что идёт после, не принадлежит никому до следующего User-agent.

Disallow: без ничего после двоеточия означает «разрешено всё». Disallow: / закрывает всё. Один символ между открытой дверью и закрытой.

robots.txt — это не контроль доступа. Это просьба, которую соблюдают воспитанные краулеры. Те, кто её игнорирует, продолжат игнорировать. Если что-то нельзя читать, нужна аутентификация, а не директива.

Crawl-delay почти все ИИ-краулеры игнорируют. Если проблема в нагрузке, ограничивайте частоту на периферии.

Content-Signal: сказать зачем, а не только можно ли

robots.txt отвечает на один вопрос: можно ли это скачать. Сказать «индексируй меня, но не обучайся на мне» он не умеет — а именно такова позиция большинства сайтов.

Content-Signal добавляет этот слой тремя независимыми сигналами:

Content-Signal: search=yes, ai-input=yes, ai-train=no
  • search — можно ли этому попасть в поисковый индекс
  • ai-input — можно ли использовать это как материал для ответа, со ссылкой на источник
  • ai-train — можно ли использовать это для обучения модели

Он ставится в robots.txt, как выше, а ещё может ехать HTTP-заголовком в каждом ответе — так делаем мы. Это молодая договорённость, а не стандарт, соблюдать который кто-то обязан, но стоит она одну строку, читается машиной и выражает намерение, которое Disallow выразить не может.

Проверьте, что ваш доходит

Написать файл и отдавать его — разные вещи:

curl -s https://example.ru/robots.txt
curl -sI https://example.ru/robots.txt | grep -i "server\|cf-cache-status"

Вторая команда важнее, чем выглядит. Если вы за CDN и своего robots.txt у вас нет, CDN может ответить за вас файлом, которого вы никогда не писали: правдоподобный 200, в котором нет ни одного вашего правила и нет вашей карты сайта. Наш делал ровно это месяцами, пока origin отдавал 404.

Сгенерировать robots.txt · Проверить, что вы отдаёте · Пускают ли ботов?