Redirect checker
Enter a URL to see every redirect it takes, the status code and Location of each one, how long each server took, and whether the page it ends on returns 200 and can be indexed. Switch to bulk to check up to 200 old URLs against the pages they should reach.
Every response on the way
Read a redirect trace in four columns
Each line in the trace is one request and one response. The checker asks for the URL, reads the status code, and if the server answered with a redirect, asks for the URL in its Location header next. It stops at the first response that is not a redirect, at a loop, or after 10 redirects.
| Column | What it tells you |
|---|---|
| Status | 301 or 308 means moved for good. 302, 303 or 307 means moved for now. Anything else ends the trace. |
| Location | Where the server sends the next request. A relative Location is shown as the full URL it resolves to. |
| Time | How long that server took to answer, in milliseconds. A slow first hop on an old domain is common. |
| Final | The page the trace ends on, with its status, any noindex, a canonical that points somewhere else, and any meta refresh. |
Most problems show up in the first two columns. A 301 then a 302 then a 200 works for visitors, but the temporary hop in the middle tells Google the move is not settled, and the extra request adds delay for everyone.
301, 302, 307 and 308 come down to two questions
Is the move permanent, and must the browser keep the request method? Those two answers pick the status code. Google only cares about the first one. Its HTTP status code guide lists 308 as "Equivalent to 301" and 307 as "Equivalent to 302".
| Status and RFC 9110 name | Permanent | Keeps POST | Google shows |
|---|---|---|---|
301 Moved Permanently | Yes | Not guaranteed | The new URL |
308 Permanent Redirect | Yes | Yes | The new URL |
302 Found | No | Not guaranteed | Usually the old URL |
307 Temporary Redirect | No | Yes | Usually the old URL |
303 See Other | No | No, it becomes GET | Usually the old URL |
The method column comes from RFC 9110, which says a browser "MAY change the request method from POST to GET" after a 301 or 302, and added 307 and 308 to rule that out. For a page that has moved, use 301 or 308 and stop there. Google's redirects guide says a temporary redirect is not used as a signal that the new URL should be canonical, though the new page "might still be indexed if other canonicalization signals are present".
Google follows 10 redirects, but one is the target
Google's crawlers "follow up to 10 redirect hops", according to the same status code guide. This checker uses the same ceiling, so a URL it reports as over 10 redirects is one Googlebot gives up on too.
Ten is a limit, not a goal. Google's site move guide advises redirecting "to the final destination directly" and otherwise keeping a chain to "ideally no more than 3 and fewer than 5", because chains add latency and "not all user agents and browsers support long redirect chains".
The same guide settles the PageRank question several redirect tools still get wrong: "301 and other permanent redirects don't cause a loss in PageRank." Shorten a chain for speed and to make the next migration easier. Shortening it does not recover lost ranking value, because a permanent redirect loses none.
Fix a redirect chain or loop in three steps
A chain usually builds up over several site changes, such as http to https, then non-www to www, then an old slug to a new one. Each rule is right on its own. Together they make three requests where one would do.
- Note the URL the trace ends on. That is the target every earlier URL should point at.
- Change each older rule to send its URL straight to that final URL. In nginx or Apache that usually means editing the oldest rule.
- Trace the first URL again here until it shows one permanent redirect and a 200.
A loop is two rules that disagree, such as one forcing a trailing slash and another removing it. The trace shows the URL that came back round, so search your redirect rules, CMS plugin and CDN settings for that path. A loop never reaches a page, so the old URL shows an error to visitors and Google alike.
Check up to 200 old URLs against the pages they should reach
After a migration, knowing where each old URL ends up is half the job. You also need to know it ended up on the page you planned. Switch the checker to bulk and put the planned target after each old URL:
https://old.example.com/about-us, https://example.com/about
https://old.example.com/blog/2019/post, https://example.com/blog/post
http://old.example.com/servicesA line with a second URL gets a verdict against it. It reaches the right page, reaches it through a chain, lands on the wrong page, does not redirect, loops, or is still redirecting after 10. A line with one URL just shows where it ends. URLs are traced five at a time, results stream in as each finishes, and the whole check counts once against the 10 free checks a day.
Download CSV writes one line per response, not one per URL, so the full chain reads top to bottom in a spreadsheet and you can filter to every 302 at once. For more than 200 rows, the CLI below takes up to 1,000 in one run.
Your browser can hide a redirect the server still sends
Browsers can cache a 301 with no end date, and they remember HSTS, the rule that says always use https on a domain. Both let a browser skip a request the server would still answer with a redirect. Chrome then shows "307 Internal Redirect" for an http URL, a redirect that never left the browser.
This checker sends every request fresh from a server, with no cache and no HSTS memory, so it shows what a crawler gets. It identifies itself as the SEO Skill crawler. A site that redirects by user agent, country or cookie can answer Googlebot or a visitor differently, so check those with URL Inspection in Search Console. Google says its inspection tools do not follow redirects, so inspect the final URL rather than the old one.
Meta refresh and JavaScript redirects are a last resort
Google's redirects guide reads an instant meta refresh as permanent and a delayed one as temporary. The checker reports a meta refresh on the page where the trace ends, with its delay and target, so you can see one hiding behind a 200. It does not follow it.
JavaScript redirects do not show here, because the checker does not run scripts. Google says to use them only "if you can't do server-side or meta refresh redirects", since Google "might never see it if rendering of the content failed". If a URL looks fine here but visitors still move, a script is doing it.
Trace redirects from your agent or terminal
The page above uses the same redirect tracer as seo redirect-trace in the CLI, with the same 10 redirect limit, 10 seconds per request and SEO Skill crawler user agent. Install it once:
npm i -g seo && seo startThen trace one URL from your own machine, which also reaches staging sites and anything behind your VPN. It reads the final page's title, canonical and robots tags too:
seo redirect-trace --url http://example.com/old-pageFor a migration, put one old_url,new_url pair per line in a CSV file, up to 1,000 rows, and check the whole map. Add --json for one result per line that an agent or script can read:
seo redirect-trace --map redirects.csvYour agent runs the same commands once setup has added the skill, so you can ask it in plain words. With the hosted MCP server, the seo page report shows a URL's live status and redirects next to Google's own URL Inspection result and the page's Search Console queries, for any page on a site you have in Search Console. Ask:
Check https://example.com/old-pricing with SEO Skill. Where does it redirect, is every hop permanent, and is the old URL still getting impressions in Search Console?Add the hosted MCP server to your agent and sign in with Google:
Run it in a terminal, then sign in with Google.
Or run it on your machine
Installs the CLI, signs you in and adds the skill to your agents. Site crawls and Bing data run this way, on your own machine. A crawl fetches many pages, and Bing blocks our hosted server.
Related checks for a redirect
- The SEO migration checklist plans a site move and reads your redirect map for duplicates and homepage targets before anything is fetched.
- The noindex checker explains which robots rule keeps the final page out of Google.
- The seo crawl command finds every redirect your own internal links still point at.