Продвинутое

Нюансы и ограничения

Краевые случаи и осознанные компромиссы краулера, правил и отчётов.
  • Дедуп URL при краула: hash отбрасывается, query сохраняется — фасеточные фильтры важны для crawl-budget анализа.
  • Исключение — трекинговые параметры: utm_*, gclid, gbraid, wbraid, fbclid, yclid, msclkid, _gl, mc_cid, mc_eid вырезаются, поэтому /a?utm_source=x и /a — одна страница; остальные параметры сохраняют порядок.
  • Страница не загрузилась (таймаут, сеть, TLS) → снапшот со statusCode 0 + crawl:timeout; page-чеки по ней пропускаются — ложных «нет title» не будет. Краулер не падает целиком никогда.
  • Page-чеки пропускаются и для снапшотов с 4xx/5xx (HTML-404 на битую ссылку /x.pdf не даст canonical:required и дублей title): саму битую ссылку сообщает links:no-broken на ссылающейся странице. Site-чеки эти снапшоты по-прежнему видят.
  • Страница, чьи редиректы заканчиваются на другом origin (внутренняя короткая ссылка /l/x → apps.apple.com), считается в crawlStats.external: она не аудируется и ссылки с неё не обходятся; links:no-redirect-chain и links:no-broken по-прежнему проверяют эту ссылку на ссылающейся странице. Ссылки страницы с редиректом внутри сайта (/a → /b/) резолвятся от конечного URL, а URL, ведущие на уже обойдённый конечный URL, дают один снапшот, который в отчёте идёт под конечным URL. Entry (crawl.entry / --url), редиректящая на другой origin (example.com → www.example.com, http → https), даёт ошибку crawl:entry-redirect с origin, который нужно указать в site.url / --url; остальные entries краулятся дальше.
  • crawl.respectRobots (по умолчанию true): <origin>/robots.txt загружается один раз, ссылки, закрытые для * (или для группы, подходящей под crawl.userAgent), не краулятся; матчинг как у Google — *, $, побеждает самое длинное правило, при равной длине Allow. Нет robots.txt или ошибка — ничего не блокируется. URL из crawl.entry (или --url) краулятся всегда; сэмплы sitemap+sample фильтруются robots.txt. Не-ASCII в правилах кодируется в percent-encoding, hex сравнивается без учёта регистра. Счётчик — crawlStats.disallowed и строка в логе краула.
  • maxPages достигнут → truncated: true в отчёте — видно, что аудит неполный.
  • Дев-сервер Nuxt — не для полного краула: компиляция на лету × параллельные вкладки = OOM воркера. Локально гоняйте --start по сборке или снижайте concurrency/maxPages; полный аудит — по deployed-окружениям.
  • insecureTls выставляет ignoreHTTPSErrors Playwright'у и NODE_TLS_REJECT_UNAUTHORIZED=0 процессу — только для dev/staging профилей.
  • Lighthouse требует установленный Chrome (chrome-launcher) и не работает с self-signed TLS — гоняйте по deployed-окружениям.
  • Вьюпорт above-fold эвристики — дефолтный Playwright 1280×720 (или crawl.viewport). srcset-only картинки без src не меряются.
  • http:x-robots-consistent входит в DevTools Level 1, но заголовков у панели нет — там он no-op.
  • Функции-источники sitemap самодостаточны: никаких замыканий на переменные nuxt.config.
  • Профиль накладывается defu-патчем: объекты сливаются, скаляры перекрываются.
  • Один прогон монитора = один JSON; ключи хранилища: timestamp (monitor) или commit SHA (MR).
  • DOM парсится linkedom (сервер) / DOMParser (панель) — один и тот же код правил работает в обеих средах.
  • Ошибка одного правила (internal:check-failed, info) не валит аудит; неизвестный rule-id в конфиге — валит с did-you-mean.