IndexNow: как сообщить поисковикам об изменениях на сайте
Поисковик узнаёт о новой странице сайта двумя способами: находит её по ссылкам при обходе или читает sitemap.xml. Оба способа работают «по расписанию» поисковика: он сам решает, когда заглянуть на сайт в следующий раз. Для небольшого блога это дни, а иногда недели. Новая статья уже опубликована, а в поиске её нет.
IndexNow переворачивает схему: не поисковик спрашивает сайт, а сайт сообщает поисковику. Протокол придумали в Microsoft (Bing) и Яндексе в 2021 году, сейчас его поддерживают Bing, Яндекс, Naver, Seznam и ещё несколько поисковиков. Google в протоколе не участвует и по-прежнему узнаёт о страницах из sitemap.
Как это работает
Весь протокол — это один HTTP-запрос. Когда на сайте появилась, изменилась или удалилась страница, сайт отправляет её адрес на endpoint поисковика. Можно отправить один адрес обычным GET:
GET https://api.indexnow.org/indexnow?url=https://www.vitaliy.org/post/indexnow-protocol-explained&key=<ключ>
А можно до 10 000 адресов за раз одним POST с JSON:
POST https://api.indexnow.org/indexnow
Content-Type: application/json
{
"host": "www.vitaliy.org",
"key": "<ключ>",
"keyLocation": "https://www.vitaliy.org/<ключ>.txt",
"urlList": [
"https://www.vitaliy.org/post/indexnow-protocol-explained",
"https://www.vitaliy.org/post/csp-against-xss"
]
}
Общий endpoint api.indexnow.org пересылает список всем участникам протокола, поэтому отдельно писать Яндексу и Bing не нужно. Ответ 200 или 202 означает «принято»; 400, 403, 422 — ошибка в запросе или ключе, повторять бессмысленно; 429 — слишком часто, нужно подождать.
Важно понимать, что принято, а что нет. Поисковик получил сигнал «посмотри этот адрес», и не более того. Он сам решит, когда прийти за страницей и добавлять ли её в индекс. IndexNow ускоряет обнаружение, но ничего не гарантирует про ранжирование.
Зачем нужен ключ
Если бы любой мог прислать адреса от имени любого сайта, поисковики получали бы мусор. Поэтому запрос подтверждается ключом, и подтверждение устроено до смешного просто: владелец сайта придумывает случайную строку от 8 до 128 символов (буквы, цифры, дефис) и кладёт на сайт текстовый файл, в котором лежит эта же строка:
https://www.vitaliy.org/<ключ>.txt
Поисковик, получив запрос, открывает файл по адресу keyLocation (или https://<host>/<ключ>.txt, если keyLocation не передан) и сверяет содержимое с ключом из запроса. Совпало — адреса от владельца. Регистрироваться нигде не надо, ключ никто не выдаёт: вы его сами придумали и сами положили на сайт. Ключ не секрет, его читает весь интернет, важна только его стабильность: смените ключ — и поисковик будет отвергать запросы, пока не прочитает новый файл.
Как это сделано в блоге
В моём блоге уведомление идёт тем же путём, что письма: обработчик команды, которая публикует, правит, переименовывает, снимает с публикации или удаляет пост, кладёт список адресов в таблицу outbox в той же транзакции, что и само изменение. Фоновый воркер забирает запись из outbox, передаёт через очередь RabbitMQ, и уже отдельный сервис отправляет POST на api.indexnow.org.
Так сделано по двум причинам. Во-первых, внешний сервис не участвует в транзакции публикации: если api.indexnow.org недоступен, статья всё равно сохранится, а уведомление уйдёт позже. Во-вторых, повторы и ошибки живут в одном месте: 429 и 5xx — повтор доставки, 4xx — запись в лог без повтора.
Что отправляется: адрес /post/<slug> опубликованного поста. При смене slug — оба адреса, новый и прежний, чтобы поисковик узнал и о появлении, и об исчезновении. Черновики и посты на модерации не упоминаются никогда. На dev-стенде фича выключена: стенд показывает те же данные под другим доменом, и его адресам в поиске делать нечего.
После включения все уже опубликованные посты отправлены один раз пачкой: 134 адреса, ответ 202. Дальше поисковики узнают о каждом изменении в момент, когда оно случилось.
Что в итоге
- IndexNow — это один HTTP-запрос со списком адресов и ключом; общий endpoint
api.indexnow.orgрассылает его всем поисковикам-участникам. - Ключ — произвольная строка, подтверждённая файлом на сайте; регистрация не нужна.
- Протокол ускоряет обнаружение страниц, но не заменяет
sitemap.xml: Google его не поддерживает, а участники всё равно сами решают, что индексировать. - Отправлять уведомление лучше не из обработчика запроса, а через outbox и очередь: тогда недоступность поисковика не мешает публикации.
Оставить комментарий могут только зарегистрированные пользователи.
Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.