A redirect chain is a URL that redirects to another URL that redirects again before reaching the final page, for example http://example.com to https://example.com to https://www.example.com/. Each extra hop adds a full network round trip for visitors and one more request for crawlers. Keep every redirect to a single hop that lands directly on the final URL.
What a redirect chain looks like
curl -sIL http://example.com/blog | grep -iE "^HTTP|^location"
HTTP/1.1 301 Moved Permanently
location: https://example.com/blog
HTTP/2 301
location: https://www.example.com/blog
HTTP/2 308
location: https://www.example.com/blog/
HTTP/2 200
Three hops before the page loads. Each rule was reasonable when it was added. Together they make every visitor on that path wait for three extra requests.
Why redirect chains hurt
- Slower pages. Every hop is a new request, often a new DNS lookup and TLS handshake. On mobile networks each one can add hundreds of milliseconds before the first byte of the real page, which drags down Largest Contentful Paint.
- Wasted crawl budget. Crawlers spend a request on every hop. On large sites that means fewer real pages crawled per day.
- Crawlers give up. Googlebot follows up to 10 redirect hops. Past that, Search Console reports Redirect error and the page is not indexed, just like pages returning errors.
- Muddier signals. Links pointing at the start of a chain have to pass through every hop. Collapsing the chain removes any doubt about where those signals should land.
Do not confuse it with Page with redirect in Search Console. That status only means the URL redirects somewhere else, so the target is indexed instead. It is normal for every redirect you set up on purpose.
Why chains build up
- Layered normalisation rules: one rule for HTTPS, another for
www, another for the trailing slash, each applied in sequence. - Site migrations: old URLs redirected to URLs that were themselves redirected in a later redesign.
- Internal links that were never updated, so every click from your own navigation starts a chain.
- Plugins and platforms adding their own redirects on top of server rules.
- Loops. Two rules that send a URL back and forth never resolve. Browsers show a "too many redirects" error and crawlers report a redirect error.
How to find redirect chains
- Check one URL with
curl -sILas shown above, or with your browser's network panel with Preserve log enabled. - Check the whole site. UpCrawler follows every redirect it meets during a crawl and flags Long redirect chains when a URL takes more than 2 hops, with the full hop list in the sample so you can see which rule to change.
- Check your internal links. Any internal link that returns a 3xx is a link that should point at the final URL instead.
How to fix redirect chains
- Point every rule at the final destination. Each source URL should redirect once, straight to the URL that returns 200.
- Combine normalisation rules into one. Redirect HTTP, non-www and missing trailing slash variants in a single step.
- Redirect on the server. Meta refresh and JavaScript redirects are slower and weaker signals. Use them only where the server cannot redirect.
- Update internal links, canonicals and the sitemap to the final URL so your own site never triggers a redirect.
- Re-crawl to confirm every redirect now resolves in one hop.
Nginx: HTTPS and www in one hop
server {
listen 80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/example.com.crt;
ssl_certificate_key /etc/ssl/example.com.key;
return 301 https://www.example.com$request_uri;
}
Requests for http://example.com, http://www.example.com and https://example.com all land on https://www.example.com in a single redirect, instead of passing through HTTPS first and www second. The server block for https://www.example.com then serves the site. After forcing HTTPS, also check for mixed content left in old pages.
Keep redirects in one place in next.config.ts and point each source at the final URL:
async redirects() {
return [
{ source: '/old-pricing', destination: '/pricing', permanent: true },
{ source: '/plans', destination: '/pricing', permanent: true }
]
}
If /plans used to redirect to /old-pricing, change it to go straight to /pricing rather than leaving both rules chained. Three more things to check:
- Status codes.
permanent: truesends a 308, which search engines treat like a 301. UsestatusCode: 301instead only for old clients that do not understand 308. - Trailing slashes. Next.js redirects
/blog/to/blogby default, which is a hop of its own. Keep internal links in the same form as yourtrailingSlashsetting. redirect()during streaming. Called after the page has started streaming, it becomes a client side redirect. Redirect innext.config.ts, inproxy.tsor before any<Suspense>boundary so crawlers get a real 3xx.
Redirect plugins such as Redirection keep a list of rules. Search the list for any rule whose target is itself the source of another rule, and point it at the final URL. Also check that WordPress's Site Address setting uses the exact final host, including https and www, so core does not add its own hop.
Shopify manages HTTPS and the primary domain for you. Chains usually come from URL redirects under Content, then Menus, then URL Redirects (or Online Store, then Navigation on older admin layouts). Edit any redirect whose target is also listed as a source.
Let AI fix it, page by page.
Paste this prompt into AI with your project open. In UpCrawler, every affected page comes with a prompt like this, already filled in with its URL.
Rewrite each existing redirect rule to point straight at the final destination so every hop resolves in one step, and update internal links to the destination so they skip the redirect entirely. Collapse chains rather than adding new redirects.
Frequently asked questions
How many redirects are too many?
One hop is normal. Two is acceptable but worth cleaning up. Three or more should always be collapsed.
Is a 301 or a 302 better for SEO?
Use a 301 or 308 for permanent moves: they tell search engines to index the target instead. A 302 or 307 keeps the original URL as the one in search, so use it only when the original will come back. Either way, a chain of them is slower than a single hop.
Do redirect chains lose link equity?
A single permanent redirect passes signals on to its target. Chains still cost speed and crawl budget, make it less certain where signals land, and fail completely past the hop limit, so there is no reason to keep them.
Share it with whoever runs your site’s SEO.