Page speed, redirects, Core Web Vitals
Reduce redirect chain length: collapse multi-hop chains
Chains of 3+ redirects waste crawl budget, leak link equity, and add hundreds of ms per hop. Collapse them to a single 301 from start to final URL.
What's happening
A redirect chain is two or more 301/302 responses in sequence before reaching a 200. Each hop costs DNS resolution (if cross-origin), TCP, TLS, and one round trip to the redirect server. On 4G mobile, that's 200-500ms per hop. Three hops adds 600-1500ms before the page can even start rendering.
Lighthouse's "Avoid multiple page redirects" audit penalizes any chain longer than 1 hop. Chrome DevTools Network panel shows the chain with each 301/302 leading to the next URL. WebPageTest visualizes it in the waterfall and counts the hops explicitly.
Google explicitly limits crawl to 5 redirect hops; beyond that the URL is dropped. Even within that limit, longer chains waste crawl budget that Google could use on indexable content. Search Console flags "redirected URLs" in the Coverage report.
Why it matters
Redirect chains directly inflate TTFB and therefore LCP. A 3-hop chain on 4G makes a sub-2.5s LCP mathematically impossible. Pages buried behind chains routinely fail Core Web Vitals.
Crawl efficiency suffers. Googlebot has a finite crawl budget per site; spending 5 requests on a chain that resolves to one URL means 4 indexable URLs went uncrawled. Long chains also dilute link equity slightly per hop.
Common causes
- Successive site migrations layered without consolidation (oldsite.com → middlesite.com → currentsite.com).
- URL structure changes (/blog/post → /posts/post → /articles/post).
- HTTP→HTTPS, then non-www→www, then trailing-slash, each as a separate redirect.
- Affiliate or tracking redirects that pass through multiple intermediaries.
- Internal links pointing to old URLs that themselves redirect to old URLs.
- CMS migrations where redirect rules accumulated without being collapsed.
Detect this on your site
Run a quick scan with the Redirect Checker. The tool surfaces this exact issue with the records and context needed to apply the fix below.
Open Redirect CheckerHow to fix it
- 1
Crawl your site for redirect chains
Use Screaming Frog, Sitebulb, or CheckFast's /redirects tool to crawl the site and list every URL with its redirect chain length. Sort by chain length descending — fix the longest first.
- 2
Map old URLs directly to final URLs
For every chain A → B → C → D, replace the redirect rules with A → D, B → D, C → D. Each old URL gets a single 301 to the current canonical, no intermediate hops.
- 3
Update internal links to final URLs
Search your codebase, sitemap, and content management system for hardcoded old URLs. Replace with the final canonical URL. Internal navigation should never trigger a redirect.
- 4
Consolidate canonicalization rules
Merge HTTP→HTTPS, non-www→www, and trailing-slash normalization into one redirect rule that handles all three at once. nginx: a single server block with conditions; Vercel/Netlify: rewrites/redirects in the config file.
- 5
Cache 301 redirects at the edge
Permanent redirects can be cached aggressively. Cloudflare, Fastly, and Vercel all serve cached 301s from the edge POP closest to the user, saving the origin round-trip. Set Cache-Control: public, max-age=86400 on permanent redirects.
- 6
Audit your sitemap.xml and canonical tags
Sitemap URLs should be the final canonical, not URLs that redirect. on each page should match the page's actual URL. Mismatches confuse Google and create duplicate-content signals.
- 7
Submit updated sitemap to Search Console
After collapsing chains, submit the updated sitemap.xml in Search Console and request re-indexing of the most important canonical URLs. Google's recrawl is faster than the default 1-4 week cycle when explicitly requested.
Example
# Bad: chain of redirects in vercel.json
{
"redirects": [
{ "source": "/blog/:slug", "destination": "/posts/:slug", "permanent": true },
{ "source": "/posts/:slug", "destination": "/articles/:slug", "permanent": true }
]
}
# Good: collapse to a single hop
{
"redirects": [
{ "source": "/blog/:slug", "destination": "/articles/:slug", "permanent": true },
{ "source": "/posts/:slug", "destination": "/articles/:slug", "permanent": true }
]
}
# nginx equivalent:
server {
location ~ ^/blog/(.+)$ {
return 301 /articles/$1;
}
location ~ ^/posts/(.+)$ {
return 301 /articles/$1;
}
}Replace chained redirects with direct old-to-final mappings.
Frequently asked
One hop is acceptable. Two is borderline. Three or more should be fixed. Google follows up to 5 hops before giving up; never get close to that limit.
Yes. Each hop loses a small amount of link equity and consumes crawl budget. Chains long enough that Google stops following (5+) drop URLs from the index entirely.
Keep them as long as the old URLs receive any traffic or external links. Removing them returns 404 to anyone using a bookmark or backlink. Audit annually and prune rules with zero hits in the last year.
Related fixes
Page speed, redirects, Core Web Vitals
Reduce too many redirects: cut chains to one hop
Page speed, redirects, Core Web Vitals
Fix redirect loop: break circular 301/302 chains
Page speed, redirects, Core Web Vitals
Fix missing www/non-www redirect to canonicalize the host
Page speed, redirects, Core Web Vitals
Fix TTFB slow: cut Time to First Byte under 800ms