Skewcheck Guides Test redirects after a migration
How to test your 301 redirects after a website migration
Updated · By SwynQ Labs Private Limited
Your redirects are live, the new site looks fine, and you've clicked a few old links that seemed to work. That isn't a test. A redirect can look right in a browser and still be temporary, take three hops, or land on the homepage instead of the matching page. The only way to know is to request every old URL in your redirect map and check what comes back.
What a passing redirect looks like
Google's own site-move guide says to do exactly this: "Test the redirects. You can use the URL Inspection Tool for testing individual URLs, or command line tools or scripts to test large numbers of URLs."
Each old URL in your map should pass all four of these:
- The first response is permanent: 301 or 308. Google recommends HTTP permanent redirects such as 301 and 308 for a site move, and says 301 and other permanent redirects don't cause a loss in PageRank. A 302 or 307 is temporary (everything curl, Redirects). Webflow's redirect help documents its redirect settings as 301 redirects, used to permanently route an old path to a new URL. Framer's redirect help says its redirects permanently route traffic from the old URL to the new one. Test the live response. That status is the one that counts.
- One hop. Googlebot can follow up to 10 hops, but Google advises redirecting straight to the final destination. If you can't, keep the chain short: ideally no more than 3, and fewer than 5. Two hops can mean an old rule and a new rule are both firing, or that the host added a hop of its own, such as http to https or a www change.
- The final page answers 200. Google's site-move guide names redirecting to a URL that does not exist as a common mistake.
- It lands on the page you planned. Google says not to redirect many old URLs to one irrelevant destination, such as the new homepage, and that this might be treated as a soft 404.
Rows you deliberately retired should answer 404 or 410 and not redirect anywhere. Google's guide says URLs for content you are not moving should return a 404 or 410.
Test one URL
For a quick spot check, use curl in a terminal. -I asks for headers only. -L tells curl to follow redirects. Curl does not follow them unless you ask.
curl -sIL https://old-site.com/old-page | grep -iE '^(HTTP/|location:)'You'll see each status line and location header in order. One 301 or 308 line followed by one 200 is what you want. -I sends a HEAD request. Some servers answer a HEAD differently from a GET. If the result looks wrong, run the same command without -I.
Browsers are meant to cache a 301, so a browser test after you fix a rule can show the old behaviour. Curl does not cache redirects.
In Google Search Console, the URL Inspection tool checks a single URL. The first view is Google's indexed copy, not a live fetch. Use Live Test on that screen to check the current page.
Test the whole map
Testing one URL at a time stops working past a dozen rows. If you used the redirect map template, this script reads it directly. It needs bash and curl. macOS includes both, and so do most Linux distributions. On Windows, use WSL or Git Bash with curl installed.
NEW_SITE=https://www.your-new-site.com ./check-redirects.sh redirect-map.csv > results.tsvFor each row it makes two GET requests, one URL at a time: one that does not follow redirects (the first status, 15 second cap) and one that follows up to 10 hops (30 second cap), matching Google's limit. It uses curl's num_redirects, http_code and url_effective write-out values and marks the row:
redirectrows PASS when the first status is 301 or 308, there is exactly one hop, the final status is 200 and the final URL equalsNEW_SITE+new_path.keeprows PASS when the page answers 200 at the expected URL with at most one hop. One hop allows for a domain change.retire-404andretire-410rows PASS when the old URL returns that status and does not redirect.- Any other action, including
redirect (wildcard), is marked CHECK. Test a few real URLs under each wildcard by hand.
The script prints a header and one tab-separated row per URL. This illustration uses the pass rules above. It is not a capture from a live site. Open the real results.tsv in a spreadsheet and filter on FAIL.
old_url expected first_status hops final_status final_url result
https://old.example/pricing https://www.new.example/pricing 301 1 200 https://www.new.example/pricing PASS
https://old.example/gone 404, no redirect 404 0 404 https://old.example/gone PASS
https://old.example/retired 410, no redirect 404 0 404 https://old.example/retired FAILThree things to know:
- The comparison is exact text, so
https,wwwand trailing slashes inNEW_SITEandnew_pathmust match how the live site writes its URLs. - The script splits on commas and does not understand quotes. A comma in
old_url,old_pathornew_pathshifts that row. Commas in later columns, such asnotes, do not. - It sends GET requests, because some servers answer HEAD differently from GET. It requests one URL at a time. For a few thousand rows, that is a sequence of requests against your own site, not a burst of parallel connections.
Prefer a desktop tool? Screaming Frog's SEO Spider can audit a list of old URLs: switch to list mode, turn on Always Follow Redirects, then export the All Redirects report.
What a FAIL usually means
| What you see | Likely cause | Fix |
|---|---|---|
| First status 302 or 307 | A temporary redirect | Make the rule permanent, then test the live response again |
| 2 or more hops | An old rule chained to a new one, or an extra hop such as http to https or a www change | Point the old URL straight at the final URL |
| Final status 404 | A typo in new_path, or the new page's slug changed | Fix the target, then rerun |
| Lands on the homepage | A catch-all, or many old URLs sent to one irrelevant page. Google says that might be treated as a soft 404 | Map the URL to its closest matching page, or retire it |
First status 200 on a redirect row | The rule isn't published, or a page still exists at the old path | Publish the redirect. On Webflow, delete, draft or re-slug a page that still lives at the old path first (Webflow redirects not working). |
Keep checking after launch
Run the script again a week after launch and record the first status in the map's day7_check_status column. Then watch Search Console's Page indexing report. A non-canonical URL that redirects is listed there as Page with redirect and is not indexed. Google's site-move guide says an unusually high number of Not found errors is a sign of incorrect redirects.
Google says that for a medium-sized website it can take a few weeks or more before it starts showing the new URLs instead of the old ones, and says to keep the redirects for as long as possible, generally at least a year.
Don't have the old URLs?
Then you can't test them yet. How to find old URLs after a migration covers where to get them.
The free Lost-URL Scan looks up the addresses public web archives saved for a domain and checks what each one returns on the live site today. It shows the top 10 free.
Want the redirect file without building the sheet? The DIY Fix Kit ($49 once; ₹3,999 in India, no GST) turns your scan's lost-URL list into a ready-to-import redirect file for Webflow, Framer, WordPress, Next.js/Vercel, Netlify, Apache, Nginx or CSV, with a re-check 7 days later. It's offered on your scan results. Run the free scan
Want it done for you? Migration Repair: we map every old URL that gets search traffic, put the redirects in and check them at launch and 7 days later. $500 per site (₹40,000 in India); sites over 60 URLs are quoted first. The redirect map for your top 10 pages is free first: email hello@swynq.com. We don't promise rankings or traffic.
Sources
- Google Search Central, Site moves with URL changes. The testing sentence, permanent 301 and 308 redirects, PageRank, the 10-hop limit, soft 404s, 404 and 410 for content you are not moving, Not found errors, the few-weeks timing, and keeping redirects for at least a year.
- Webflow Help, How do I set up redirects in Webflow?. 301 redirects, described there as a permanent route from an old path to a new URL. A live page at the old path has to be removed or re-slugged before the redirect applies.
- Framer Help, How to set up redirects to maintain SEO ranking. Redirects permanently route traffic from an old URL to a new one. Updated 15 September 2026.
- everything curl, Redirects. 301 and 308 are permanent, 302 and 307 are temporary,
-Lfollows redirects, browsers are meant to cache a 301, and curl does not cache redirects. - curl man page,
--write-out.http_code,num_redirectsandurl_effective. - Redirect Tracer, How to check URL redirects.
-Iis a HEAD request, and some servers answer HEAD differently from GET. - Google Search Console Help, URL Inspection tool and Page indexing report. Live Test, Page with redirect, and Not found (404).
- Screaming Frog, How to audit redirects in a site migration. List mode, Always Follow Redirects, All Redirects report.
Questions
What should a migration redirect return?
The first response should be 301 or 308, there should be one hop, and the final page should return 200 at the URL you planned. Google recommends HTTP permanent redirects such as 301 and 308 for a site move.
Why can a browser show a redirect I already changed?
Browsers are meant to cache a 301, so a test after you fix a rule can show the old behaviour. curl does not cache redirects.
What if I no longer have the list of old URLs?
You can't test a redirect you can't name. How to find old URLs after a migration covers Search Console, analytics, the old sitemap and web archives.