Tools help·3 min read

Inside DRIFT: redirect chains, loops and www drift, hop by hop

How DRIFT follows every redirect by hand, the verdict order from loop to clean, how it infers your preferred host, and what each verdict means for your sitemap and your migration.

Nikko Nanji

Nikko Nanji - technical SEO consultant

Published - Last reviewed

Short answer: a browser follows redirects silently. DRIFT doesn't. It requests each URL with redirects switched off, reads the Location header, and walks the chain one hop at a time, up to 10 hops. That gives it the exact hop codes, the final status, loops, and whether the URL ended on your preferred host. Each URL gets one verdict and one sitemap action: keep, replace the loc, or drop.

Basic usage is in DRIFT: how it works. This is the walk itself.

What you paste in

URLs, usually a sitemap's locs or a migration's legacy list. Up to 2,000 per run: the page sends them in batches of 20, with a short polite pause between requests. You can name a preferred host (for example https://samplebrand.test). If you don't, DRIFT infers it from the most common host in your list, ignoring the www.

The walk, under the hood

  • One hop at a time. Each response is recorded with its status and absolute Location. Seeing a URL twice (after normalising host case, trailing slash and fragment) is a loop.
  • Hop cap. After 10 redirects DRIFT stops and calls it a chain.
  • The last stop. On a final 200 HTML page, DRIFT reads meta robots and X-Robots-Tag, so a chain that ends on a noindex page is caught.
  • Rate limits. A 429 after retries is reported as "Couldn't prove", with a note, never as broken.

The verdict order

The first match wins:

VerdictRulePrioritySitemap action
Couldn't provefetch error, 429, or final 5xxP0Re-run
Redirect loopa URL repeats in the chainP0Drop or fix
Broken at endfinal status isn't 2xxP0Drop, or restore the target
Ends noindexedfinal page says noindexP1 (WARN)Drop, or remove the noindex
Long/messy chain3 hops or more, or the capP0Replace the loc with the final URL
www/apexnot on the preferred hostP0Use the preferred host
Path movedfinal path or query differsP1Update the loc to the final URL
http to https onlyonly the scheme changedP1Update the sitemap to https
Clean 200 selfnone of the aboveP2Keep

The www/apex test also fires when a URL starts on the wrong host class, even if it ends on the right one. A sitemap loc on www. when you've chosen apex is a ticket in its own right.

Edge cases

  • A redirect with no Location header stops the walk, and the row is judged on that 3xx as the final status, so it shows as broken.
  • A trailing slash difference alone isn't a path move. DRIFT normalises it out.
  • Ends noindexed is a WARN, not a FAIL. Sometimes it's deliberate. It still shouldn't be in a sitemap.

Worked example

CASE FILE: legacy list after a platform move, samplebrand.test
http://www.samplebrand.test/shop/blue-kit
https://samplebrand.test/old-sale
https://samplebrand.test/a

Live: row 1  301 -> https://www.samplebrand.test/shop/blue-kit
             301 -> https://samplebrand.test/shop/blue-kit
             301 -> https://samplebrand.test/kits/blue-kit (200)
Live: row 2  301 -> https://samplebrand.test/sale (404)
Live: row 3  302 -> https://samplebrand.test/b 302 -> https://samplebrand.test/a

VERDICT: CHAIN (P0), BROKEN (P0), LOOP (P0)

Row 1 takes three hops to land, so it's a chain. Collapse it to one 301 straight to /kits/blue-kit, and change the sitemap loc to match. Row 2 redirects to a dead page: restore /sale, or point the redirect at the closest live page. Row 3 loops between /a and /b. That's a server rule bug, and nothing reaches the page.

Run it: open DRIFT

The money angle

Chains leak in two ways: crawl spent on hops, and the wait people sit through before the page they wanted. Broken ends and loops are worse. Any link equity or paid traffic pointed at those URLs lands on nothing.

After a migration, DRIFT is how I prove the redirect map is behaving, URL by URL, before anyone declares the move done. That's the core of the SEO migration work. To value the fix groups, send them to PAYBACK.

Sources