Redirects are normal. Sites move pages, switch to HTTPS, change URL formats and merge content. The trouble starts when redirects pile on top of each other: a page moved in 2021, then again in 2023, then the whole site switched to trailing slashes. Each change added a hop, and nobody went back to tidy up.
This guide explains what redirect chains and loops are, why they matter, and how to clean them up in one pass.
What is a redirect chain?
A redirect chain is a URL that redirects more than once before it reaches the page that actually loads:
| Hop | URL | Response |
|---|---|---|
| 1 | http://example.com/shoes |
301 → https |
| 2 | https://example.com/shoes |
301 → trailing slash |
| 3 | https://example.com/shoes/ |
302 → new section |
| 4 | https://example.com/running/ |
200 |
A redirect loop is a chain that never ends because one of the URLs redirects back to an earlier one. Browsers show “too many redirects” and crawlers give up.
Why do redirect chains matter?
Crawlers have a limit. Google’s documentation on HTTP status codes and redirects says its crawlers follow up to 10 redirect hops by default. Most chains are shorter than that, but chains created by several migrations can get surprisingly long.
Every hop is another round trip. Each redirect is a separate request and response before the page starts loading. Visitors on slow mobile connections feel it most.
Temporary redirects send a weaker signal. Google treats 301 and 308 redirects as a strong signal that the target should be indexed, and 302 and 307 as a weak one. Chains often mix the two, like hop 3 in the example above, which leaves Google less certain which URL you want indexed.
They hide other mistakes. Internal links, canonical tags, sitemaps and hreflang annotations that point to redirecting URLs are usually what keeps old chains alive.
How do you find redirect chains?
For a single URL, follow the redirects in a terminal and read the Location headers:
curl -sIL https://example.com/shoes | grep -iE "^HTTP|^location"
For a whole site you need a crawler. Crawlens records every redirect it follows and runs five checks on them:
| Check | What it flags | Severity |
|---|---|---|
| Redirect loops | Chains that come back to an earlier URL and never resolve | Critical |
| Redirect chains (2+ hops) | URLs that take two or more redirects to reach the final page | Warning |
| Internal links point to redirects | Pages linking to a URL that redirects, adding a hop for every visit | Warning |
| Temporary redirects (302/303/307) | Redirects that signal a move isn’t permanent | Notice |
| HTTP version does not redirect to HTTPS | http:// still serving the site instead of redirecting |
Warning |
Each chain is reported with its number of hops and its final URL, which is exactly what you need to fix it.
How do you fix a redirect chain?
1. Point every old URL straight at the final destination
Rewrite each redirect rule so it goes directly to the final URL with a single 301 (or 308). In the example, http://example.com/shoes, https://example.com/shoes and https://example.com/shoes/ should all redirect straight to https://example.com/running/.
2. Normalise the URL in one step
The most common source of chains is URL normalisation done in separate rules: HTTP to HTTPS, then non-www to www, then adding a trailing slash. Combine them so any variant reaches the canonical form in one hop.
3. Update internal links
Redirects are for people and bots arriving from outside. Your own links should point to the final URL directly. Fix navigation, footer and template links first, because one template change can remove thousands of redirected links.
4. Update canonicals, sitemaps and hreflang
Canonical tags, XML sitemaps and hreflang annotations should all reference final, 200-status URLs. A sitemap full of redirects is a common reason chains keep getting crawled long after a migration.
5. Use the right status code
If a move is permanent, use 301 or 308. Keep 302 and 307 for genuinely temporary situations, like a seasonal page or maintenance.
6. Break loops first
Loops are the only redirect problem that makes a URL completely unreachable. Fix them before anything else.
How do you stop chains from coming back?
- Re-crawl after every migration and compare the new crawl with the previous one, so new chains show up as new issues.
- Keep one redirect map (a spreadsheet or config file) and update existing rules instead of adding new ones on top.
- Schedule a regular crawl. Chains creep back in as content changes; a monthly crawl catches them while they’re still short.
Checklist
- No redirect loops
- Every redirect reaches its final URL in one hop
- HTTP, www and trailing-slash variants normalised in a single redirect
- Internal links point to final URLs, not redirects
- Canonicals, sitemaps and hreflang list only final 200 URLs
- Permanent moves use 301 or 308
Frequently asked questions
What is a redirect chain?
A redirect chain is when a URL redirects to another URL that redirects again, possibly several times, before reaching a page that returns 200. For example, http://example.com/shoes → https://example.com/shoes → https://example.com/shoes/.
How many redirects does Googlebot follow?
Google's crawlers follow up to 10 redirect hops by default, according to Google's documentation. Content beyond that isn't fetched, so a chain longer than 10 hops means the final page isn't reached from that URL.
Do redirect chains hurt SEO?
Short chains usually still work, but each hop slows the page for users and crawlers, and long or broken chains can stop crawlers from reaching the final page. They also tend to hide bigger problems, like temporary redirects used for permanent moves.
Should I use a 301 or a 302 redirect?
Use 301 or 308 when a move is permanent; Google treats those as a strong signal that the target should be indexed. 302 and 307 are a weak signal and are meant for temporary moves.
What's the difference between a redirect chain and a redirect loop?
A chain eventually ends at a working page. A loop never does, because a URL in the chain redirects back to an earlier one. Browsers show an error and crawlers give up, so loops should be fixed first.