1. Your redirect map
Headers like Redirect from / Redirect to, source / destination, old url / new url and the WordPress Redirection plugin's export are recognised, with an optional status-code column. No header is fine too.
Choose a file or paste the text, then click Check map.
Result
Cleaned map
The rules, and what they leave out
- Loops: /a to /b to /a, or a page sent to itself (also with or without a trailing slash). Left out of the cleaned map: a human has to decide.
- Chains: any redirect whose target is itself redirected. Google follows a few hops but recommends one. The cleaned map points every source at the end of its chain.
- Duplicates: the same old URL listed twice. Identical rows are merged; different targets are an error, and the first is kept so you can see it. Paths are compared ignoring letter case unless you say your server is case-sensitive.
- Staging targets: a destination on
localhost,staging.,*.vercel.app,*.myshopify.comand similar preview hosts is warned, since a map copied from a test build often keeps them. - Homepage: more than a tenth of a map (of ten rows or more) ending at
/reads as soft 404s to Google. A few are noted but not warned. - URL shape: spaces (written as %20 in the cleaned map), a
#fragmentin a source (never sent to the server; removed), a source with no leading slash (added), wildcards and regular expressions (exact-match importers ignore them), sources on another host, relative or http targets, over-long URLs, malformed %-escapes. - Status codes: 301 and 308 are permanent; 302, 303 and 307 are flagged for a migration. 410 rows are carried through. The cleaned map uses 301 unless a row says otherwise.
- New-site list: each redirect's final destination must be in it, or it is a redirect to a 404. Old-site list: URLs with no rule are counted and the first few named.
- Limits from memory: Shopify takes a two-column CSV, only from paths on its own domain, no wildcards, up to 100,000 redirects. Other platforms differ; the page checks only what it can state.
- Not checked: that the redirects behave this way on your live server, regular-expression and query-string rules, hostname and protocol rules, and whether a destination is a good match for the old page. Test a sample of live URLs after you deploy.
Common questions
Why do redirect chains and loops hurt after a site migration?
A chain (/a to /b to /c) makes every visitor and crawler make extra requests, and search engines may stop following after a few hops, so the final page can inherit less of the old page's ranking. A loop (/a to /b to /a) never resolves and shows the visitor ERR_TOO_MANY_REDIRECTS. Both are common when a new map is stacked on top of an old one. This tool finds each and writes the map with every old URL pointing straight at its final destination.
Should I redirect everything to the homepage?
No. Google treats a redirect from a page to an unrelated one, especially the homepage, as a soft 404, so the old page's ranking may not carry over. Send each old URL to its closest equivalent. If a page has no equivalent, a 410 Gone is more honest. The tool warns when more than a tenth of your rows go to the homepage.
What format does the Shopify redirect import use?
From memory of Shopify's help pages: a CSV with two columns, Redirect from and Redirect to, with paths starting with a slash. Shopify cannot redirect from another domain, does not match wildcards, and caps the list at 100,000 redirects. This tool flags each of those and can write the cleaned map in exactly that shape, or as Netlify or Cloudflare Pages _redirects lines, Apache Redirect directives or an nginx map block.
What do I paste in the new-site and old-site boxes?
Both are optional. Paste the URLs your new site really serves (for example from its sitemap) and the tool errors on every redirect whose final destination is not among them, which is a redirect to a 404. Paste the old site's URLs (from a crawl or its sitemap) and it lists the ones that have no redirect at all.
Is it safe to paste a redirect map into a web page?
The page runs in your browser, the file is read locally and nothing is uploaded; a test in the code asserts there are no network calls.
What does this not check?
Whether the redirects actually behave that way on your live server, regular-expression or wildcard rules, query-string handling that differs by platform, hostname or protocol rules, and whether a destination page is a good match for the old one. It reads the file only. Test a sample of the live URLs after you deploy.