
Ты сделал работу. Страница server-rendered. JSON-LD лежит в сыром ответе. curl возвращает всю статью целиком, вместе с заголовком. Краулер, который заберёт твой URL, получит всё, что нужно.
Вот только краулер твой URL не забирает. Он спрашивает CDN, а CDN отвечает 403.
Твой контент безупречен и недостижим. Это слой под тем, о котором все говорят, — и он невидим в любом инструменте, за который ты обычно берёшься.
Два разных «нет»
robots.txt — записка, приклеенная к двери. Она говорит «пожалуйста, не входи». Вежливый краулер читает её и разворачивается. Невежливый игнорирует и проходит мимо. В любом случае записка не касается твоих байтов — это просьба, которую обеспечивают исключительно манеры самого гостя.
Правило WAF или CDN — это сама дверь. Оно отвечает на запрос само, на краю, до того как что-либо дойдёт до твоего origin: 403 Forbidden, 429 Too Many Requests или JavaScript-челлендж, который бот не решит. HTML за этой дверью может быть шедевром или пустой страницей. Бот не видит ни того, ни другого. Он видит код статуса.
Люди неделями доводят до ума записку и ни разу не проверяют, заперта ли дверь.
Это не гипотеза — вот данные
Cloudflare Radar публикует, что реально происходит с трафиком ИИ-краулеров в их сети. Из дашборда AI Insights (7-дневное окно, на 18 июля 2026), среди всех HTTP-ответов, отданных ИИ-ботам и краулерам:
- 200 OK — 73,6%
- 403 Forbidden — 5,2%
- 429 Too Many Requests — 1,3%
- 503 — 1,1%

Прочитай ещё раз. Больше одного запроса из пятнадцати от ИИ-краулеров активно отклоняется на краю — 403 или 429 — ещё до того, как коснётся контента. Не понижается в приоритете. Отклоняется.
И это по большей части не решение. Это дефолт — managed-набор правил WAF, тумблер «блокировать ИИ-ботов», щёлкнутый в 2024-м, перекрученный bot-fight score. Трекер robots.txt того же дашборда показывает GPTBot, CCBot и ClaudeBot как самые запрещаемые краулеры среди топовых доменов — во многом унаследованно, а не осознанно.

Почему ты сам этого никогда не заметишь
Открой свой сайт. Он грузится. Разумеется — твоего браузера нет в блоклисте. Домашний IP, User-Agent Chrome, ты проходишь любую проверку.
Открой robots.txt. Allow: /. Выглядит совершенно гостеприимно.
Посмотри исходник. Чистый HTML, разметка, всё на месте. (Эту часть ты уже починил.)
Любой инструмент, за который ты возьмёшься, подтверждает, что всё хорошо, — потому что каждый из них приходит от тебя, а не от GPTBot. Блок нацелен на класс гостей, которым ты никогда не станешь.
Единственное место, где это видно: серверные логи
Браузер врёт, потому что браузер — это ты. robots.txt врёт, потому что он рекомендательный. Access-лог не врёт. В нём одна строка на каждый реальный запрос, с User-Agent гостя и точным статусом, который ты вернул. Это единственная запись того, что GPTBot реально получил.
Грепни те, что важны, и посчитай их коды статусов:
grep -E "GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|PerplexityBot|Google-Extended" access.log \
| awk '{print $9}' \
| sort | uniq -c
200 — получил страницу. 403 — край отказал. 429 — ты зарейтлимитил его до немоты. Сбой, который никто не ловит, выглядит так: robots.txt нараспашку, а логи полны 403. Всё, что ты видишь, говорит «да»; то, что решает, говорит «нет».
Я читал ровно эту историю не раз. Месяцы контента, ноль упоминаний в ChatGPT и Perplexity — и аудит, который наконец находит, что Cloudflare всё это время отдавал GPTBot 403.
Ловушка внутри фикса
Очевидная починка — пропускать всё, у чего в User-Agent есть GPTBot, — неверна, потому что User-Agent это строка, которую любой может набрать. Скрапер цен подписывается GPTBot и спокойно проходит через твоё щедрое новое правило.
Собственный трекинг прозрачности у Cloudflare бьёт в точку: он помечает, каких операторов вообще можно верифицировать. На середину 2026-го ByteDance значится непроверенным — и это ровно та причина, по которой одному User-Agent доверять нельзя.

Поэтому настоящая проверка — не имя. Это происхождение. Два способа:
1. Проверка по опубликованным IP-диапазонам. OpenAI, Anthropic и остальные публикуют IP своих краулеров — openai.com/gptbot.json, openai.com/searchbot.json, openai.com/chatgpt-user.json и их аналоги. Сделай reverse-DNS по IP запроса, убедись, что хостнейм принадлежит вендору, затем forward-резолвом верни его обратно к тому же IP. Если хоть один шаг не сошёлся — это спуфер, надевший чужое имя.
2. Проверка по криптоподписи. Именно туда всё идёт. Web Bot Auth — IETF-драфт под руководством Cloudflare (draft-meunier-web-bot-auth-architecture, поверх RFC 9421) — заставляет краулеры подписывать каждый запрос Ed25519-ключом, так что личность доказана, а не заявлена. Он встроен в программу Cloudflare Verified Bots с отдельным каталогом Signed Agents, а агент ChatGPT попал в первый подписанный когорт в 2025-м. И это не только Cloudflare — AWS WAF добавил поддержку Web Bot Auth в конце 2025-го, автоматически пропуская проверенных агентов.
Честно про статус: Web Bot Auth — активный IETF-драфт, а не ратифицированный стандарт. Но раз Cloudflare, OpenAI, Anthropic и AWS двигаются в ногу, это уже де-факто направление.
Суть для тебя: «блокировать плохих ботов» и «пустить ИИ» — это одна и та же задача, и User-Agent не решает ни ту, ни другую. Проверяй по происхождению или по подписи — иначе заблокируешь краулер, который хочешь, и впустишь тот, который нет.
Что реально делать
Смотри в логи, не в браузер. Вытяни логи за неделю, отфильтруй по ИИ-User-Agent, посмотри на коды статусов. Это и есть весь аудит — вечер, а не проект.
Видишь 403/429 — ищи правило. Почти всегда это managed-набор, настройка «блокировать ИИ-ботов» или перекрученный bot-fight score, а не строчка, которую ты написал. Разрешай нужные краулеры по проверенному IP или Web Bot Auth, никогда — по одному User-Agent.
Правило, которое я вынес
Твой HTML — последнее в пути запроса, а не первое. Прежде чем бот прочитает хоть один его байт, запрос должен пройти DNS, CDN, WAF, рейт-лимитер, скоринг bot-management. Любой из них может оборвать запрос кодом статуса, которого ты не видишь, — на странице, которая для тебя рисуется безупречно.
«У меня в браузере работает» всегда было слабым доводом. Для краулеров это даже не тот вопрос. Правильный вопрос: какой код статуса получил бот? И единственный честный ответ — в логах.