Skip to main content
All fixes

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 Checker

How to fix it

  1. 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. 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. 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. 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. 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. 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. 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