Redirect Chain Issues
What This Means
A redirect chain occurs when a URL redirects to another URL, which then redirects to another URL, creating a multi-step journey before reaching the final destination. Redirect loops happen when URLs redirect to each other in a circle, creating an infinite loop. Both issues slow down page loading, waste crawler budget, dilute link equity (PageRank), and create poor user experiences.
How Redirect Chains Work
Normal Redirect (Good):
User requests: example.com/old-page
↓ (301 redirect)
Arrives at: example.com/new-page
1 hop = Fast, minimal SEO impact
Redirect Chain (Bad):
User requests: example.com/page
↓ (301 redirect)
example.com/page-v2
↓ (301 redirect)
example.com/page-v3
↓ (301 redirect)
example.com/final-page
3 hops = Slow, significant SEO impact
Redirect Loop (Disaster):
example.com/page-a
↓ (301 redirect)
example.com/page-b
↓ (301 redirect)
example.com/page-a
↓ (infinite loop)
Browser error: "Too many redirects"
Impact on Your Business
Performance Impact:
- Slower page loads - Each redirect adds 200-500ms
- Poor Core Web Vitals - Delays LCP and FCP
- Higher bounce rates - Users leave during redirects
- Mobile users suffer most - Slower networks amplify delays
SEO Consequences:
- Lost PageRank - Each redirect loses 15-25% of link equity
- Wasted crawl budget - Googlebot follows chains, uses quota
- Delayed indexing - New pages take longer to appear
- Lower rankings - Google may not follow long chains
- Confused signals - Search engines unsure which URL to rank
User Experience:
- Frustration - Waiting for multiple redirects
- Broken bookmarks - Chains change over time
- Lost conversions - Users abandon slow pages
- Cart abandonment - E-commerce checkout delays
Real-World Examples:
- Amazon found 100ms delay = 1% revenue loss
- 3-redirect chain = ~600ms delay minimum
- Google may stop following after 5 redirects
- Mobile users on 3G wait 1-2 seconds per redirect
How to Diagnose
Method 1: Screaming Frog SEO Spider
- Download Screaming Frog
- Enter your domain
- Click Start
- Go to Response Codes → Redirection (3xx)
- Check Redirect Chains tab
What to Look For:
Redirect Chains Found:
example.com/old-url → example.com/v2 → example.com/final (2 hops)
example.com/product → example.com/p → example.com/product-final (2 hops)
Redirect Loops Found:
example.com/loop-a → example.com/loop-b → example.com/loop-a (LOOP!)
Method 2: Chrome DevTools Network Tab
- Open DevTools (
F12) - Go to Network tab
- Navigate to a URL
- Check for multiple 301/302 redirects
Identify Chains:
Request waterfall:
1. example.com/page Status: 301 → /page2
2. example.com/page2 Status: 301 → /page3
3. example.com/page3 Status: 200 ✓
Result: 2-hop redirect chain
Method 3: curl Command
# Follow redirects and show each hop
curl -L -I https://example.com/old-url
# Output shows chain:
HTTP/2 301
location: https://example.com/v2
HTTP/2 301
location: https://example.com/v3
HTTP/2 200
# Final destination
# Count redirect hops
curl -s -L -D - https://example.com/url -o /dev/null | grep "HTTP/" | wc -l
# Output: 4 (means 3 redirects + 1 final response)
Method 4: Online Redirect Checker
- Visit Redirect Checker or Redirect Path
- Enter URL
- View redirect chain
Example Report:
Redirect Chain Analysis:
1. https://example.com/product
Status: 301 Moved Permanently
Location: https://example.com/products/widget
2. https://example.com/products/widget
Status: 301 Moved Permanently
Location: https://www.example.com/products/widget
3. https://www.example.com/products/widget
Status: 200 OK
Total hops: 2
Total time: 847ms
Recommendation: Fix redirect chain
Method 5: Google Search Console
- Open Search Console
- Go to Coverage report
- Look for Excluded section
- Check for "Page with redirect" warnings
Check:
- Pages marked as "Redirect"
- Indexed URL vs actual URL mismatches
- Crawl anomalies
General Fixes
Fix 1: Update Direct Links
Replace chain with direct redirect:
# BEFORE: Chain of redirects
# .htaccess
Redirect 301 /old-page /page-v2
Redirect 301 /page-v2 /page-v3
Redirect 301 /page-v3 /final-page
# Result: 3 hops
# AFTER: Direct redirect
# .htaccess
Redirect 301 /old-page /final-page
Redirect 301 /page-v2 /final-page
Redirect 301 /page-v3 /final-page
# Result: 1 hop for each
Fix 2: Fix Protocol Redirects (HTTP → HTTPS)
Eliminate double redirect:
# BEFORE: HTTP → HTTPS → WWW (2 hops)
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
# User visits: http://example.com/page
# Hop 1: → https://example.com/page
# Hop 2: → https://www.example.com/page
# AFTER: Direct redirect (1 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;
return 301 https://www.example.com$request_uri;
}
# User visits: http://example.com/page
# Hop 1: → https://www.example.com/page (direct)
Fix 3: Apache .htaccess Optimization
Combine multiple redirects:
# BEFORE: Multiple redirect rules causing chains
RewriteEngine On
# HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# Non-www to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
# Result: http://example.com → https://example.com → https://www.example.com
# AFTER: Single redirect
RewriteEngine On
# Combine both conditions
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
# Result: http://example.com → https://www.example.com (1 hop)
Fix 4: Fix Trailing Slash Redirects
Avoid unnecessary redirects:
# BEFORE: Trailing slash redirect + other redirects
location /products {
rewrite ^/products$ /products/ permanent; # Adds trailing slash
}
location /products/ {
rewrite ^/products/$ /shop/all-products/ permanent; # Redirects to new location
}
# Result: /products → /products/ → /shop/all-products/
# AFTER: Direct redirect
location /products {
rewrite ^/products/?$ /shop/all-products/ permanent;
}
# Result: /products → /shop/all-products/ (1 hop)
Fix 5: Update Internal Links
Point links directly to final destination:
<!-- BEFORE: Links to old URLs that redirect -->
<a href="/old-product-page">Buy Widget</a>
<!-- Chain: /old-product-page → /products/widget → /shop/widget -->
<!-- AFTER: Link directly to final URL -->
<a href="/shop/widget">Buy Widget</a>
<!-- No redirects needed -->
Database update for WordPress:
-- Update all internal links in WordPress
UPDATE wp_posts
SET post_content = REPLACE(
post_content,
'example.com/old-url',
'example.com/new-url'
);
-- Update redirecting URLs in menu links
UPDATE wp_postmeta
SET meta_value = REPLACE(
meta_value,
'example.com/old-url',
'example.com/new-url'
)
WHERE meta_key = '_menu_item_url';
Fix 6: Fix Redirect Loops
Identify and break loops:
# PROBLEM: Redirect loop
RewriteRule ^old-page$ /new-page [R=301,L]
RewriteRule ^new-page$ /old-page [R=301,L]
# Result: Infinite loop!
# FIX: Remove conflicting rule
RewriteRule ^old-page$ /new-page [R=301,L]
# new-page doesn't redirect anywhere
WordPress loop fix:
// PROBLEM: Plugin or theme causing redirect loop
// Disable all plugins, switch to default theme
// Re-enable one by one to find culprit
// Common causes:
// - SSL plugin redirecting to HTTPS when already HTTPS
// - Multiple redirect plugins conflicting
// - .htaccess rules conflicting with WordPress permalinks
// FIX: Clear redirect rules in .htaccess
// Regenerate permalinks: Settings → Permalinks → Save
Fix 7: Cloudflare Page Rules
Optimize Cloudflare redirects:
# BEFORE: Multiple Page Rules creating chain
Rule 1: http://*example.com/* → https://example.com/$1
Rule 2: https://example.com/* → https://www.example.com/$1
# AFTER: Single Page Rule
Rule 1: http://*example.com/* → https://www.example.com/$1
https://example.com/* → https://www.example.com/$1
Fix 8: JavaScript/Meta Redirect Cleanup
Avoid client-side redirects:
<!-- BEFORE: Server redirect followed by JavaScript redirect -->
<!-- Server: 301 from /old → /page -->
<!-- Then on /page: -->
<script>
window.location.href = '/final-destination';
</script>
<!-- Total: 2 hops, slow! -->
<!-- AFTER: Single server-side redirect -->
<!-- Server: 301 from /old → /final-destination -->
<!-- No JavaScript redirect needed -->
Platform-Specific Guides
Detailed implementation instructions for your specific platform:
| Platform | Troubleshooting Guide |
|---|---|
| Shopify | Shopify Redirect Chain Guide |
| WordPress | WordPress Redirect Chain Guide |
| Wix | Wix Redirect Chain Guide |
| Squarespace | Squarespace Redirect Chain Guide |
| Webflow | Webflow Redirect Chain Guide |
Verification
After fixing redirect chains:
Test 1: curl Check
# Verify single hop
curl -I https://example.com/old-url
# Should show:
HTTP/2 301
location: https://www.example.com/final-url
# (only ONE redirect)
Test 2: Screaming Frog
- Crawl site again
- Check Redirect Chains tab
- Should be empty or greatly reduced
Test 3: Chrome DevTools
- Navigate to previously chained URL
- Check Network tab
- Should show 1 redirect max
Test 4: Page Speed
- Run PageSpeed Insights
- "Avoid multiple page redirects" warning should clear
- LCP and FCP should improve
Common Mistakes
- Creating new chains when fixing old ones - Always redirect to final destination
- Not updating internal links - Links still point to redirecting URLs
- Forgetting canonical tags - Use canonical to reinforce correct URL
- Mix of 301 and 302 - Use 301 for permanent redirects
- Not testing after deploy - Verify redirects work as expected
- Hardcoding domain - Use relative URLs where possible
- Not monitoring - Chains can reappear over time
- Ignoring www vs non-www - Pick one and stick with it