Краулер обошёл сайт, сервер вернул 200, canonical на месте — но позиции падают. Причина часто не в отдельных тегах, а в связях между страницами. Редиректы, canonical и hreflang образуют граф: если цель ссылки недоступна или ведёт в цикл, поисковик может игнорировать сигнал. В этой статье — как проверять эти связи автоматически, отличать неизвестную цель от ошибки и встроить проверки в CI.

Почему граф, а не список URL

Классический аудит проверяет каждый URL отдельно: статус-код, наличие canonical, корректность hreflang. Но SEO-сигналы работают в связке. Canonical указывает на другую страницу; hreflang ссылается на языковые версии; редирект ведёт на новый адрес. Если цель недоступна или образует петлю, сигнал теряется. Графовый подход позволяет увидеть цепочки и циклы, которые не видны при построчном анализе.

Например, страница A отдаёт canonical на B, B редиректит на C, а C возвращает 404. Формально каждый элемент валиден, но итоговый сигнал не работает. Граф покажет разрыв.

Шаг 1: собираем данные и строим граф

Начните с краулера, который для каждого URL сохраняет: статус-код, заголовок Location (для редиректов), значение canonical, пары hreflang. Этого достаточно, чтобы построить направленный граф, где вершины — URL, а рёбра — типы связей (redirect, canonical, hreflang).

Важно различать типы рёбер: редирект — это переход, canonical — указание, hreflang — альтернатива. Для каждого типа свои правила валидации. Например, цепочка редиректов длиннее двух шагов — риск; canonical на страницу с редиректом — ошибка; hreflang на несуществующую локаль — ошибка.

Совет: не пытайтесь обойти весь сайт за один запуск. Начните с ключевых разделов или карты сайта. Для проверки графа достаточно выборки, если она репрезентативна.

Шаг 2: правила проверки и критерии ошибок

Вот минимальный набор правил, которые стоит автоматизировать:

  • Редиректы: цепочка длиннее 2 переходов — предупреждение; цикл — критическая ошибка; редирект на 404 — ошибка.
  • Canonical: цель возвращает не 200 — ошибка; canonical указывает на страницу с другим canonical (цепочка) — предупреждение; canonical отсутствует на странице с параметрами — предупреждение.
  • Hreflang: цель возвращает не 200 — ошибка; отсутствует обратная ссылка (x-default или другой язык) — предупреждение; дублирование пар язык-регион — ошибка.

Критерий выбора порога: если ошибка ломает сигнал (цикл, 404), она критична; если усложняет обработку (длинная цепочка), это предупреждение. Настройте пороги под свой сайт, но не игнорируйте предупреждения — они часто предшествуют ошибкам.

Отличайте неизвестную цель от ошибки. Если краулер ещё не обошёл URL, цель может быть неизвестна. В этом случае ставьте статус «требует проверки», а не «ошибка». Иначе получите ложные срабатывания.

Шаг 3: сохраняем доказательства и встраиваем в CI

Для каждого нарушения сохраняйте: URL-источник, тип связи, целевой URL, статус-код цели, timestamp. Этого достаточно, чтобы воспроизвести проблему и передать разработчику. Храните отчёты в машиночитаемом виде (JSON) и добавляйте ссылку на конкретную страницу.

В CI запускайте проверку графа на каждом пулл-реквесте или перед релизом. Но не блокируйте сборку на предупреждениях — только на критических ошибках. Например, цикл редиректов или canonical на 404 должны останавливать деплой. Длинные цепочки — только уведомлять.

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

Типичные ошибки и как их избежать

  • Игнорирование обратных связей. Hreflang должен быть взаимным. Проверяйте, что для каждой пары A→B существует B→A.
  • Проверка только первого редиректа. Цепочка может вести на 404. Всегда проверяйте конечную цель.
  • Canonical на страницу с параметрами. Если canonical ведёт на URL с UTM-метками, сигнал может размываться. Сравнивайте с чистым URL.
  • Отсутствие временных меток. Без timestamp невозможно понять, когда возникла ошибка. Всегда сохраняйте время проверки.

Ещё одна ошибка — пытаться автоматизировать всё сразу. Начните с одного типа связей, например редиректов, и постепенно добавляйте canonical и hreflang. Так вы быстрее получите работающий пайплайн.

В итоге графовый аудит даёт не просто список ошибок, а понимание, как сигналы распространяются по сайту. Это помогает приоритизировать исправления и предотвращать регрессии.