Почему ИИ-бот не видит сайт: проверка по логам

7 минут чтения

ИИ-бот не получает страницу, если 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 сентября заняло одну строку.

robots.txt fomenko.by
# фрагмент группы для всех ботов; строку 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 сентября:

Ответ на запрос картинки до 7 сентября 2026
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:

Проверка 8 октября 2026
$ 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 своей страницы.

Шаг 2: ответ сервера
# какой бот: 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 перечислите начала адресов своих страниц, остальное команда назовёт «прочее».

Шаг 3: журнал со сверкой IP (подставьте путь к своему журналу)
# пути страницы и картинки из шага 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-адрес каждого запроса со списками владельцев ботов. В таблице только прошедшие проверку.

Настоящие боты на fomenko.by с 24.09 по 07.10.2026

Ответов 200 на страницы (разных)
Картинок статей и фото отдано файлом

Яндекс, все роботы

Ответов 200 на страницы (разных)

913 (139)

Картинок статей и фото отдано файлом

125

Google: основной робот и картинки

Ответов 200 на страницы (разных)

589 (86)

Картинок статей и фото отдано файлом

79

Apple

Ответов 200 на страницы (разных)

331 (33)

Картинок статей и фото отдано файлом

340

Perplexity

Ответов 200 на страницы (разных)

204 (40)

Картинок статей и фото отдано файлом

14

Bing

Ответов 200 на страницы (разных)

165 (50)

Картинок статей и фото отдано файлом

71

ChatGPT-User, ссылка из разговора

Ответов 200 на страницы (разных)

30 (20)

Картинок статей и фото отдано файлом

0

ClaudeBot

Ответов 200 на страницы (разных)

0, только robots.txt и карта сайта: 47 запросов

Картинок статей и фото отдано файлом

0

OAI-SearchBot, поиск ChatGPT

Ответов 200 на страницы (разных)

0, только robots.txt: 97 запросов

Картинок статей и фото отдано файлом

0

GPTBot, обучение моделей OpenAI

Ответов 200 на страницы (разных)

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 не пришёл ни разу. Попали ли страницы в ответы ассистентов, журнал тоже не скажет.

С чего начать

Прогоните три шага. Первые два показывают ответ вашему компьютеру; проверенные запросы в журнале подтверждают визит бота и ответ сервера. Если доступ есть, а в ответах вас нет, дальше работают упоминания: разбор трёх факторов. Нужна переделка сайта: разработка сайтов.

Что дальше

Новые посты на почту

Без спама. Отписка в один клик в любом письме.