Redirect chains that only appear after domain switches go live
What happened
A practitioner post in r/TechSEO details a migration case study focused on redirect chains that only surface after a domain switch goes live. The core problem: global rules that swap the old domain for the new one can silently create chains when old URLs already carry their own redirect history or return non-200 status codes.
The post walks through a full redirect-testing methodology for staging environments, covering URL mapping, chain prevention, and a specific trap with domain-switch catch-all rules.
Why it matters
Redirect chains during migrations are nothing new. What makes the domain-switch scenario tricky is that the chains don’t exist on either domain independently. They only appear when global domain-replacement rules interact with existing per-URL redirects.
Consider this sequence: old.com/page-a already 301s to old.com/page-b. You add a catch-all rule that rewrites old.com/* to new.com/*. Now a request to old.com/page-a hits the catch-all first, redirects to new.com/page-a, which then redirects again to new.com/page-b (or wherever your 1:1 mapping sends it). That’s a two-hop chain at minimum. If page-b also had a redirect, you get three hops.
RFC 7231 Section 6.4 defines redirect status codes but sets no hard limit on chain length. In practice, browsers cap redirect follows, and Googlebot follows a limited number of hops before abandoning the chain. Each extra hop also adds latency and dilutes link equity transfer during the critical post-migration window.
The timing matters too. Old domains accumulate URLs that return 4xx and 5xx errors. A blanket domain-replacement rule turns those dead URLs into live redirects pointing at new-domain paths that may not exist, generating soft 404s or unexpected chains on the new domain.
What to do
Map high-value URLs first. The post recommends pulling URLs with clicks and impressions from GSC, organic landing pages from GA4, ranked URLs from your rank tracking tool, and backlinked URLs from GSC plus external link databases. Keep these in a separate list so you can verify each one individually.
Use absolute URLs as redirect targets. Every target should include protocol, full domain, and path. Confirm each target returns a 200.
Order your rules carefully. The post recommends applying 1:1 redirect rules before global rules (http to https, non-www to www). When 1:1 rules fire first, the request reaches its final destination in one hop. Global rules then only handle URLs not covered by specific mappings.
Update legacy redirects before launch. If any existing redirect target on the old domain is itself a URL that needs redirecting, replace it. Point every link in the chain directly to the final destination. A migration is the right time to flatten chains that have accumulated over years.
Don’t use a blanket domain-replacement rule as a catch-all. The post flags this as the biggest trap. Old domains carry dead URLs that return 4xx and 5xx status codes. A global find-and-replace rule converts those into redirects to new-domain paths that may not exist. Instead, let non-mapped old URLs return their original status codes, or redirect them to a relevant category page on the new domain.
Test on staging before the DNS switch. Crawl your staging environment with your redirect rules applied. Check for chains, loops, and targets that don’t return 200s. Tools like Screaming Frog can follow redirect chains and flag anything over one hop.
Watch out for
Rule ordering varies by server. Apache processes rules top-down within .htaccess, but Nginx evaluates location blocks differently. Cloudflare Page Rules and redirect rules have their own priority logic. The “1:1 before global” advice only works if your server actually respects that order. Test with curl -v against a handful of URLs to confirm.
Trailing slash and protocol variants. Each variant of a URL (http vs https, www vs non-www, trailing slash vs none) needs to resolve in a single hop. If your global normalization rules fire before your 1:1 rules, you can get an extra hop. Map all variants in your crawl test.