ИИ-бот не получает страницу, если robots.txt запрещает её адрес, если сервер отвечает ему ошибкой или проверкой «вы не робот» или если приходит HTML без текста, который дорисовывает JavaScript. При перенаправлении смотрите конечный адрес и его ответ. Проверяют конкретные адреса: страницу, которую хотите видеть в ответах нейросетей, и картинку с неё.
Код 200 значит только, что сервер ответил успешно. Есть ли в ответе нужный текст или файл, проверяют отдельно.
Ниже наш случай: страницы fomenko.by были открыты всегда, а картинки статей до 6 сентября 2026 года закрывала от всех роботов одна строка. И срез журнала: поиск ChatGPT читал robots.txt и не запросил ни одной страницы, а все запросы с именем GPTBot пришли не от OpenAI.
Это три разных события, и видны они в разных местах. Статья про первое.
Прочитал
Журнал подтверждает запрос настоящего бота и статус ответа. Нужный текст проверяют отдельно
robots.txt, ответ сервера, защита от ботов. Чинится настройками сайта
Проиндексировал Google или Яндекс
Search Console для Google, Вебмастер для Яндекса
Польза страницы, дубли, время. Индекс других сервисов эта проверка не подтверждает
Процитировал
Ответ ассистента на вопрос по вашей теме
Решает ассистент. Настройкой сервера не включается
Картинки статей и материалов на fomenko.by отдаются через адрес вида /api/media/<путь к файлу>. В robots.txt для всех ботов стояла строка Disallow: /api/: ею закрывали служебные запросы сайта, и под неё попали все эти картинки.
Снаружи этого не видно: страницы открываются. Ошибку я нашёл, когда проверил адрес картинки. Карта сайта при этом объявляла 64 записи о картинках на закрытых адресах. Исправление 6 сентября заняло одну строку.
# фрагмент группы для всех ботов; строку Allow: /api/media/ добавили 6 сентября 2026 User-Agent: * Allow: / Allow: /api/media/ Disallow: /admin/ Disallow: /cabinet/ Disallow: /api/
Тут работают два правила. Google и Яндекс выбирают самое длинное правило, совпавшее с началом адреса: /api/media/ длиннее /api/, поэтому картинки открылись, а прочее API осталось закрытым.
И бот читает только свою группу: если в файле есть группа для GPTBot, строки группы со звёздочкой к нему не применяются. Групп для ИИ-ботов у нас одиннадцать плюс общая, строка добавлена в каждую. Заводите группу для своего бота, переносите в неё и служебные строки общей.

Сервер отвечал на адрес картинки перенаправлением 302 на временную ссылку хранилища с подписью в адресе. Подпись жила пять минут, без неё хранилище отвечало 403. Проверка на проде 6 сентября:
GET https://fomenko.by/api/media/fomenko/blog/claude-v-belarusi/cover.jpg → 302, Cache-Control: public, max-age=300 → Location: https://<хранилище>/…?X-Amz-Expires=300&X-Amz-Signature=… GET того же файла в хранилище без подписи → 403 AccessDenied
Робот получал адрес на чужом домене, каждый раз новый, и сохранённый адрес через пять минут отвечал 403. Проверять, как с этим справляется каждый бот, я не стал: 7 сентября сервер начал отдавать файл сам, с кешем на год. Проверка 8 октября с именем GPTBot:
$ curl -sI -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.4; +https://openai.com/gptbot)" \
https://fomenko.by/api/media/fomenko/blog/geo-tri-faktora/dostup.jpg \
| grep -iE '^(http|content-|cache|etag)'
HTTP/2 200
content-type: image/jpeg
content-length: 123184
cache-control: public, max-age=31536000, immutable
etag: "4a47fe1b366f1996a6473ec5ac1f1675"
$ curl -sI -H 'If-None-Match: "4a47fe1b366f1996a6473ec5ac1f1675"' \
https://fomenko.by/api/media/fomenko/blog/geo-tri-faktora/dostup.jpg
HTTP/2 304Команды для bash, все три шага я прогнал на нашем сайте и сервере 8 октября. Если сервер ведёт подрядчик, перешлите ему этот раздел со своими адресами. Сначала выберите бота: поиск ChatGPT ходит как OAI-SearchBot, ссылку из разговора открывает ChatGPT-User, GPTBot собирает тексты для обучения моделей. Настройки у них независимые, поэтому закрытый GPTBot поиску ChatGPT не мешает.
1. robots.txt. Откройте ваш-сайт/robots.txt, найдите группу своего бота или группу со звёздочкой и примените два правила выше к адресам страницы и картинки. Адрес картинки берите из исходного кода страницы.
2. Ответ на запрос с именем бота. Подставьте свои адреса и фразу из исходного HTML своей страницы.
# какой бот: OAI-SearchBot (поиск ChatGPT), ChatGPT-User (ссылка из разговора), GPTBot (обучение)
UA='Mozilla/5.0 (compatible; OAI-SearchBot/1.3; +https://openai.com/searchbot)'
PAGE=https://fomenko.by/blog/geo-tri-faktora-popast-v-vydachu-nejrosetej
IMAGE=https://fomenko.by/api/media/fomenko/blog/geo-tri-faktora/dostup.jpg
TEXT='Попасть в выдачу нейросетей значит' # фраза из исходного HTML вашей страницы
for url in "$PAGE" "$IMAGE"; do
curl -s -o /dev/null -A "$UA" -w '%{http_code} %{content_type} %{redirect_url}\n' "$url"
done
curl -s -A "$UA" "$PAGE" | grep -cF "$TEXT" # 0 = фраза не найденаНорма: 200 и правильный тип у обоих адресов, счётчик больше нуля. Ноль значит, что фраза не найдена: посмотрите тело ответа, там бывает пустая заготовка для JavaScript или проверка «вы не робот». 403, 429 или 503 только с именем бота означают защиту хостинга или CDN. У перенаправления проверьте конечный ответ и содержимое, а у временной ссылки учитывайте срок действия.
3. Журнал: что получил настоящий бот. Защита бывает настроена по IP-адресам, поэтому ответ ноутбуку ничего не говорит об ответе боту. Команда сверяет IP каждой строки со списком владельца бота и только потом считает ответы. В PAGES перечислите начала адресов своих страниц, остальное команда назовёт «прочее».
# пути страницы и картинки из шага 2, начала адресов остальных ваших страниц, бот и его список IP
PAGE=/blog/geo-tri-faktora-popast-v-vydachu-nejrosetej
IMAGE=/api/media/fomenko/blog/geo-tri-faktora/dostup.jpg
PAGES='/blog/ /uslugi/ /materials/'
BOT=OAI-SearchBot; LIST=https://openai.com/searchbot.json
# другие списки: GPTBot https://openai.com/gptbot.json, ChatGPT-User https://openai.com/chatgpt-user.json,
# ClaudeBot https://claude.com/crawling/bots.json, PerplexityBot https://www.perplexity.ai/perplexitybot.json
curl -s "$LIST" > bot-ips.json
zcat -f /var/log/nginx/access.log* \
| BOT="$BOT" PAGE="$PAGE" IMAGE="$IMAGE" PAGES="$PAGES" python3 -c '
import collections, ipaddress, json, os, re, sys
env = os.environ
nets = [ipaddress.ip_network(p.get("ipv4Prefix") or p.get("ipv6Prefix"))
for p in json.load(open("bot-ips.json"))["prefixes"]]
line = re.compile(r"^(\S+) .*?\"\S+ (\S+)[^\"]*\" (\d{3}) .*\"([^\"]*)\"$")
count = collections.Counter()
for row in sys.stdin:
m = line.match(row.rstrip())
if not m or env["BOT"].lower() not in m[4].lower():
continue
ip, path, status = m[1], m[2].split("?")[0], m[3]
real = any(ipaddress.ip_address(ip) in n for n in nets)
if path == env["PAGE"]: kind = "ваша страница"
elif path == env["IMAGE"]: kind = "ваша картинка"
elif path == "/robots.txt": kind = "robots.txt"
elif path.startswith("/sitemap"): kind = "карта сайта"
elif path == "/" or path.startswith(tuple(env["PAGES"].split())): kind = "другие страницы"
elif re.search(r"\.(jpe?g|png|webp|gif|avif|svg)$", path): kind = "картинки"
else: kind = "прочее"
count[("настоящий" if real else "чужой IP", status, kind)] += 1
for key, n in count.most_common():
print(n, *key)'# наш журнал за 24.09-07.10, строки «чужой IP» убраны # BOT=OAI-SearchBot, список OpenAI 83 настоящий 200 robots.txt 14 настоящий 301 robots.txt # BOT=ClaudeBot, список Anthropic 24 настоящий 200 карта сайта 23 настоящий 200 robots.txt
Строки «чужой IP» не считайте: имя бота подставит кто угодно. Яндекс общего списка не публикует, его проверяют по DNS: имя хоста по IP должно кончаться на yandex.ru, .net или .com и вести обратно на тот же IP.
Если бот пропал из журнала, проверьте лимит частоты и автобан: наш сервер блокирует IP-адрес на сутки после сотни ошибочных ответов за десять минут. Пустой ответ из-за JavaScript я разбирал в статье про выдачу нейросетей. Если бот страницу получает, а в поиске её нет, проверьте noindex и сроки индексации.
8 октября я выгрузил журнал nginx с 24 сентября по 7 октября и сверил IP-адрес каждого запроса со списками владельцев ботов. В таблице только прошедшие проверку.
Яндекс, все роботы
913 (139)
125
Google: основной робот и картинки
589 (86)
79
Apple
331 (33)
340
Perplexity
204 (40)
14
Bing
165 (50)
71
ChatGPT-User, ссылка из разговора
30 (20)
0
ClaudeBot
0, только robots.txt и карта сайта: 47 запросов
0
OAI-SearchBot, поиск ChatGPT
0, только robots.txt: 97 запросов
0
GPTBot, обучение моделей OpenAI
0 с IP-адресов OpenAI
0
К адресам /api/media/, закрытым до 6 сентября, настоящие боты обратились 132 раза, и ни разу не получили перенаправления. Ответов 403 и 429 у них нет. Пять ответов 502 пришлись на минуты выкладки, один из них Яндекс получил на robots.txt. По стандарту ошибка сервера на robots.txt значит «закрыт весь сайт», а Google в таком случае первые 12 часов не обходит сайт.
Запросов с именем GPTBot 2 632, с IP-адресов OpenAI ни одного: 2 559 пришли с одного адреса хостинга. Посчитай я всех по имени, GPTBot получил бы 1 361 ответ на страницы, вровень с Google и Яндексом. Всего не с адресов владельцев пришли 5 684 строки из 17 701.

Первые пять ботов таблицы страницы и картинки получают. В robots.txt страницы разрешены и OAI-SearchBot с ClaudeBot, но за эти две недели они их не запрашивали; почему, журнал не показывает. Настоящий GPTBot не пришёл ни разу. Попали ли страницы в ответы ассистентов, журнал тоже не скажет.
Прогоните три шага. Первые два показывают ответ вашему компьютеру; проверенные запросы в журнале подтверждают визит бота и ответ сервера. Если доступ есть, а в ответах вас нет, дальше работают упоминания: разбор трёх факторов. Нужна переделка сайта: разработка сайтов.
GEO-оптимизация сайта: что входит и сколько стоит
Шесть работ GEO-оптимизации сайта: 5–18 часов, 775–2 790 BYN или 20 000–72 000 ₽. Как принять каждую и что исполнитель гарантировать не может.
Через сколько SEO даёт первый трафик
Замер по 36 статьям: в индекс Яндекса за часы или дни, первый человек из поиска по медиане через 28 часов. Разбираю, почему одни страницы собирают сотни.
Как попасть в выдачу нейросетей
Почему ChatGPT и Алиса не советуют ваш сайт и как это исправить. Три фактора попадания в выдачу нейросетей: доступ боту, упоминания, свежесть модели.