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:
| Verdict | Rule | Priority | Sitemap action |
|---|---|---|---|
| Couldn't prove | fetch error, 429, or final 5xx | P0 | Re-run |
| Redirect loop | a URL repeats in the chain | P0 | Drop or fix |
| Broken at end | final status isn't 2xx | P0 | Drop, or restore the target |
| Ends noindexed | final page says noindex | P1 (WARN) | Drop, or remove the noindex |
| Long/messy chain | 3 hops or more, or the cap | P0 | Replace the loc with the final URL |
| www/apex | not on the preferred host | P0 | Use the preferred host |
| Path moved | final path or query differs | P1 | Update the loc to the final URL |
| http to https only | only the scheme changed | P1 | Update the sitemap to https |
| Clean 200 self | none of the above | P2 | Keep |
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
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/aVERDICT: 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.
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.