---
title: "ERR_TOO_MANY_REDIRECTS: causes and how to fix it"
description: "Two rules are bouncing the request back and forth — most often an HTTPS redirect at the application level fighting a proxy that is forwarding as plain HTTP,…"
canonical: "https://lemwatch.com/errors/err-too-many-redirects"
source: "https://lemwatch.com"
---

# ERR_TOO_MANY_REDIRECTS: The page is stuck in a redirect loop

> Two rules are bouncing the request back and forth — most often an HTTPS redirect at the application level fighting a proxy that is forwarding as plain HTTP, so each side thinks the other needs to upgrade.

## Short answer

 Two rules are bouncing the request back and forth — most often an HTTPS redirect at the application level fighting a proxy that is forwarding as plain HTTP, so each side thinks the other needs to upgrade.

## What ERR_TOO_MANY_REDIRECTS means

 Browsers follow a limited number of redirects (usually 20) before giving up. A loop means the chain never terminates: A sends you to B, and B sends you back to A.

## Causes and fixes, most likely first

- The CDN forwards to the origin over HTTP while the origin redirects all HTTP to HTTPS — an infinite loop. Switch the CDN's SSL mode to Full so the origin leg is encrypted, or make the origin trust the forwarded-proto header instead of the raw scheme.
- www and non-www rules each redirect to the other. Pick one canonical hostname and make sure only one rule redirects, in one direction.
- A CMS's configured site URL disagrees with the hostname being requested. Set the CMS site/home URL to the exact canonical hostname and scheme in use.
- A stale cookie is driving a login redirect loop. Clear cookies for the domain and retry. If a private window works and a normal one does not, this is the cause.

## ERR_TOO_MANY_REDIRECTS on specific platforms

- ERR_TOO_MANY_REDIRECTS on Chrome — The loop is usually stored in a cookie, so Chrome keeps redirecting even after the server-side rule is fixed.
- ERR_TOO_MANY_REDIRECTS on Nginx — A 'return 301 https://$host$request_uri' block inside the HTTPS server block sends HTTPS traffic back to itself, producing an infinite loop…
- ERR_TOO_MANY_REDIRECTS on Cloudflare — SSL mode set to Flexible makes Cloudflare fetch the origin over plain HTTP; the origin then redirects to HTTPS, Cloudflare follows it back…
- ERR_TOO_MANY_REDIRECTS on WordPress — WP_HOME and WP_SITEURL set to https:// while a proxy passes the request as http:// makes WordPress redirect endlessly trying to reach the…
- ERR_TOO_MANY_REDIRECTS on Shopify — A domain pointed at Shopify through a third-party proxy or a CNAME on the apex creates a loop between the proxy's redirect and Shopify's…
- ERR_TOO_MANY_REDIRECTS on Netlify — A catch-all rule in _redirects that matches its own destination path re-enters itself on every pass.

## How to stop it happening again

- Monitor the redirect chain, not just the final status — a loop that resolves for cached visitors still breaks new ones.
- Assert a single canonical hostname and scheme in one place only.

## Check your own domain

 The uptime probe returns the full redirect chain, so you can see the exact two URLs bouncing off each other instead of inferring it from behaviour.

## Frequently asked questions

### How do I fix ERR_TOO_MANY_REDIRECTS?

 Trace the redirect chain from outside the browser. Nine times out of ten it is an HTTPS redirect at the origin fighting a CDN that forwards over HTTP — fix by using an encrypted origin connection or honouring the forwarded-proto header.

### Why does clearing cookies sometimes fix it?

 Because a stale session cookie can trigger a login redirect that immediately redirects back. That loop is per-visitor, not site-wide.


## Related

- [All website error codes](https://lemwatch.com/errors)
- [ERR_CONNECTION_TIMED_OUT](https://lemwatch.com/errors/err-connection-timed-out)
- [ERR_SSL_PROTOCOL_ERROR](https://lemwatch.com/errors/err-ssl-protocol-error)
- [HTTP 301](https://lemwatch.com/http-status-codes/301)
- [HTTP 302](https://lemwatch.com/http-status-codes/302)
- [HTTP 307](https://lemwatch.com/http-status-codes/307)
- [HTTP 308](https://lemwatch.com/http-status-codes/308)
- [Free Uptime & response check](https://lemwatch.com/tools/website-uptime)
