Skip to content
PПромтбук
RUEN
01Аудит

Поиск битых ссылок и 404

Все ссылки — внутренние, внешние, изображения, OG-картинки, sitemap-URL, redirect-chains. Что чекать руками и чем автоматизировать (linkinator / lychee).

Битые ссылки — самый дешёвый класс багов: видны метрикой (404 в логах), режут SEO, бесят. Этот промт — структурированный sweep с автоматизацией и приоритизацией.

Site: {{site_url}}

Чем чинить руками vs автоматизировать

ЧтоСпособВремя
10-20 ключевых страницруками15 мин
Внутренний весь сайтlinkinator / lychee5 мин setup, 2-10 мин run
Внешние ссылкиlinkinator с --externalдольше (rate limits)
Images 404lychee + img-фильтр+ 2 мин
Sitemap consistencycurl + jq30 сек

1. Автоматический проход

linkinator

npx linkinator {{site_url}} \
  --recurse \
  --skip "^https?://localhost" \
  --concurrency 8 \
  --format csv \
  > links-report.csv

lychee (быстрый, на Rust)

brew install lychee
lychee --max-concurrency 8 --include-fragments --base {{site_url}} {{site_url}}

Lychee perks: проверяет fragment IDs (#section), быстрее, лучше для CI.

2. Категоризация

CRITICAL

  • 404 на internal (/about, /pricing)
  • 404 на ассеты в img/CSS/JS
  • 5xx на любые internal
  • Redirect loops
  • Mixed content (http в https)

SERIOUS

  • 404 на external известные (Wikipedia, GitHub) — обнови или удали
  • 404 в OG/Twitter card image — link preview сломан
  • Redirect chains >2 hops
  • 308 на http→https которые должны быть прямо https

LOW PRIORITY

  • 404 на external small blogs — link rot
  • 200 но slow (>5s)
  • Soft-404 (200 но контент «не найдено»)

3. Sitemap consistency

curl -s {{site_url}}/sitemap.xml | \
  grep -oP '(?<=<loc>)[^<]+' | \
  while read url; do
    echo "$(curl -s -o /dev/null -w '%{http_code}' "$url") $url"
  done | grep -v "^200"

Проверь:

  • Sitemap URL отвечают 200
  • Sitemap не содержит noindex pages — конфликт
  • Sitemap не содержит redirected URLs — Google запутается

10 ключевых страниц:

  1. DevTools Elements: $$('a[href]').map(a => a.href)
  2. Cmd-click на каждую
  3. Особое внимание:
    • Footer (часто забывают апдейтить)
    • Anchor links #section — реально есть такой ID?
    • Buttons-as-links (onClick={() => router.push(...)}) — есть таргет?

5. Images sweep

npx linkinator {{site_url}} --recurse \
  | grep -E "(jpg|png|webp|svg|gif|ico)" \
  | grep -E "(BROKEN|404)"

Искать:

  • <img> broken src
  • OG image <meta property="og:image"> — 404
  • Favicon — 404 (видит каждый юзер)
  • Внешние CDN-картинки (Imgur / Discord CDN убивают со временем)

6. CI-интеграция

- name: Check links
  run: npx linkinator {{site_url}} --recurse --skip "^https?://localhost"

Раз в неделю (cron) или на каждый production deploy.

Anti-patterns

  • ❌ Sweep только внутренних ссылок — пропустишь broken external CDN
  • ❌ Sweep раз в год — link rot накапливается ежедневно
  • ❌ Не различать критичность — потеряешь приоритеты в 200-strong списке
  • ❌ Ignore redirects — /old/new через 3 hops, SEO weight теряется
  • ❌ Не чинить favicon 404 — первое что видит каждый юзер
  • ❌ Fragment IDs не проверять — пользователи получают «битый» якорь
  • ❌ Внешние ссылки на github-issue / linkedin без archive.org — link rot inevitable

Output

  1. Критичные: список с URL + где ссылка + что чинить
  2. Серьёзные: то же, второй приоритет
  3. CI-сетап: что добавлено
  4. Sitemap sync: какие URL пропали / появились
  5. Метрика: «было N broken, осталось M»
К подразделу «Аудит»
Похожие промты