Direct Answer
A redirect chain is several redirects in a row (A → B → C); a redirect loop is a chain that comes back to a URL it already visited, so the browser stops with "too many redirects". To fix either one, trace the URL to see every hop, then point the first redirect straight at the final URL and remove the rule that sends traffic back.
Step 1: Trace the URL#
Enter the URL in the Redirect Checker. It lists every hop with its status code and flags a chain, a hop over plain HTTP, a temporary redirect where a permanent one belongs, and a loop. You can also trace from a terminal:
bashcurl -sIL http://old-site.com/pricing | grep -iE '^(HTTP|location)'
HTTP/1.1 301 Moved Permanently
location: https://old-site.com/pricing
HTTP/2 301
location: https://www.old-site.com/pricing
HTTP/2 301
location: https://new-site.com/pricing
HTTP/2 200This example is a three-hop chain. If the same location lines repeat until curl stops with "Maximum redirects followed", it is a loop.
Step 2: Flatten a chain into one hop#
- Write down the final URL, the one that answers 200.
- In RedirHub, open the link for the first URL in Links and set its destination to that final URL, with https:// and the right host (www or not). To change many links at once, select them and use the bulk bar, or import a CSV.
- Keep the intermediate redirects if other sites still link to them, but point each of them straight at the final URL too.
- Trace the URL again. You should see one 301 and then a 200.
Each extra hop adds a full round trip before the page starts loading, and Google follows only a limited number of hops before it gives up on a URL, so a single hop is the goal.
Step 3: Find what causes a loop#
| What you see | Cause | Fix |
|---|---|---|
| http → https → http → https … | One rule forces HTTPS while another (often in the CMS or at the CDN) sends traffic back to HTTP. | Keep one HTTPS rule and remove the other. The CMS site URL should start with https://. |
| www → non-www → www … | Two systems disagree on the canonical host, for example the registrar forwards to www and the site redirects to the bare domain. | Pick one host. Set every redirect, and the site's own URL setting, to that host. |
| Loop only behind Cloudflare | SSL/TLS mode is Flexible: Cloudflare talks HTTP to the origin, the origin redirects to HTTPS, and Cloudflare asks over HTTP again. | Set Cloudflare SSL/TLS to Full (strict) when the origin has a valid certificate. |
| old-site.com → old-site.com/new → old-site.com/new … | A whole-domain redirect points to a path on the same domain, so the destination matches the redirect again. | Redirect to a different host, or replace the whole-domain redirect with path links for the URLs that need to move. |
| A → B → A | Two path redirects point at each other, often after a URL was moved back. | Delete or repoint one of them. |
| Loop only for some visitors | A cookie, language or device rule on the destination site redirects back. | Trace from a private window and test that rule on the destination site. |
Step 4: Check again and clear caches#
Browsers cache 301 redirects, so a loop you have already fixed can keep appearing in your own browser. Test in a private window or with curl, and clear the browser cache if needed.
Trace a URL now See every hop, its status code and the issues worth fixing, for any public URL.
Open the Redirect CheckerStill stuck? See Troubleshooting new redirects for DNS and HTTPS problems, and Matching for how a request finds its redirect.
Frequently asked questions
A chain is several redirects that end on a working page (A → B → C). A loop never ends because it comes back to a URL it already visited (A → B → A), so the browser shows ERR_TOO_MANY_REDIRECTS.
Each hop adds delay, and Google follows only a limited number of hops per URL. Pointing the first redirect straight at the final URL avoids both problems.
Trace the URL to see which two URLs repeat, then remove or repoint one of the rules that send traffic between them. The most common causes are conflicting http/https or www rules and Cloudflare's Flexible SSL mode.
Not from a whole-domain redirect: it matches every path on the domain, so it would match its own destination and loop. Use path links for the URLs that move, or redirect to a different host.
