<b>A client-side router built an infinite crawl trap from one slash</b>
A marketplace's crawl stats exploded — Googlebot was fetching 90,000 URLs a day on a site with 8,000 real pages. Indexing of actual products slowed to a crawl as the budget drained.
Log analysis showed endless variants: <code>/shoes</code>, <code>/shoes/</code>, <code>/shoes//</code>, <code>/shoes///</code>. The client-side router happily resolved every one of them to the same view, returning 200 each time and rendering links that themselves appended slashes. The crawler followed the trail into a fractal of duplicate URLs that never ended.
No server ever rejected the malformed paths because the SPA shell answered everything. The router normalized the URL visually after render, so users never noticed — but each variant was a distinct, crawlable, 200-status page to Google.
We added server-side 301s collapsing duplicate slashes before the shell loaded, plus a strict canonical.
—Crawled URLs/day: 90,000 → 9,200
—Product pages indexed: +28% as budget freed up
A permissive router is a crawl trap with good intentions. Normalize URLs on the server, not after hydration.
Hydrate Diaries
@HydrateDiaries
<b>A client-side router built an infinite crawl trap from one slash</b>
Этот пост опубликован в Telegram-канале Hydrate Diaries. Подписаться можно по ссылке: @HydrateDiaries.