Blog

/

Redirects

ERR_TOO_MANY_REDIRECTS: how to find and fix a redirect loop

·

7

min

·

Diagram of overlapping redirect loops bouncing between /a and /b, illustrating the ERR_TOO_MANY_REDIRECTS error

You open a page and, instead of loading, the browser stops with an error: ERR_TOO_MANY_REDIRECTS, or “This page isn’t redirecting properly”.

It means the browser followed redirect after redirect and never reached a page. At some point, the chain points back to an address it already visited.

The loop is almost always caused by two systems that each think they’re in charge. Find those two, and the fix is usually quick.

What a redirect loop looks like

The simplest loop is two rules pointing at each other:

example.com/a → example.com/b

example.com/b → example.com/a

More often, the loop hides across different layers:

http://example.com → https://example.com (set in your hosting)

https://example.com → http://example.com (set somewhere else)

Each rule makes sense on its own. Together, they never end. Browsers give up after a set number of hops and show the error. You can read the short definition in our glossary.

Step 1: rule out your browser

Browsers cache permanent redirects. If you fixed something earlier, your browser may still be replaying the old version.

Open the URL in a private window. If it works there, the loop is already gone and you only need to clear your cache.

Step 2: see the whole chain

Paste the URL into our redirect tester. It follows each hop and stops when it detects a loop. You’ll see exactly which addresses repeat.

From the terminal, curl -IL https://example.com shows the same thing, one block per hop.

Look for the first URL that appears twice. The two hops around it are your suspects.

Step 3: check the usual causes

HTTPS set up in two places. Your hosting forces https://, while a proxy or CDN in front of it talks to your server over http://. The server redirects to HTTPS, the proxy fetches HTTP again, and so on. With Cloudflare, this often happens when its SSL mode is set to Flexible while the origin forces HTTPS.

www and non-www fighting. One system sends example.com to www.example.com, another sends it back. Pick one version and make every layer agree.

A rule that matches its own destination. A wildcard such as /blog/* → /blog/new/* also matches /blog/new/..., so it keeps adding to the path. Make the rule more specific, or send it to a different prefix.

A domain redirected to itself. It sounds obvious, but it happens during migrations. The old and new domains get swapped in a rule, or a catch-all points back to the same domain.

Redirects in two systems at once. For example, a WordPress plugin and the server config both redirect the same page in opposite directions. Decide which system owns the redirect and remove it from the other.

Step 4: fix it in one place

Once you know the two conflicting hops, remove or change one of them. Don’t add a third rule to compensate. That usually moves the loop rather than ending it.

A good rule of thumb: each redirect should be defined in exactly one system. That’s one reason we argue that redirects should live outside your website.

Step 5: test again, everywhere

After the fix, test in a private window and with the tester. Check:

  • http:// and https://

  • with and without www

  • one URL caught by each wildcard rule

How to avoid loops in the first place

Most loops come from two systems both handling the same job. A few habits prevent them:

  • Decide who owns HTTPS. Either your host, your CDN or your redirect service forces https://, not all three.

  • Decide who owns www. Pick one version of the domain, and set the redirect in one place.

  • Point rules at final URLs. A rule should never send visitors to a URL that another rule redirects again.

  • Write wildcard rules carefully. Make sure a wildcard’s destination can’t match its own pattern.

  • Test before launch. Run the important URLs through a redirect tester before you switch DNS.

When the loop only affects some visitors

Sometimes a loop only happens for logged-in users, or only in one country. That usually points to cookies, a login redirect, or geo rules on the destination site, not the domain redirect itself. Test in a private window and from the redirect tester, which has no cookies, to tell the two apart.

Loops in Redirect Supply

Redirect Supply always sends www to the bare domain first, then runs your rule. That’s two hops by design, not a loop. A loop would only happen if a rule’s destination points back to the same domain and path. Our redirects not working doc covers what to check.

Ready to keep every link alive?

Ready to keep every link alive?

Ready to keep every link alive?