serps.io
All free tools

Technical

Redirect Chain Checker

Follow every hop a URL takes

In build

Enter a URL and get every hop it passes through: each status code, each Location header, the final destination, the total hop count, and whether the chain ends in a real page, a loop, or an error.

Get early access

What it returns

  • Every hop in order, each with its status code (301, 302, 303, 307, 308), the Location header it sent, and the absolute URL that header resolved to.
  • The final URL and its status, so you can see whether the chain lands on a 200, a 404, or another redirect that nothing followed.
  • The hop count, flagged above one, because every extra hop is latency a visitor pays and a step a crawler may decide not to take.
  • A loop reported separately from a long chain: a chain ends somewhere, a loop returns to a URL already visited and never terminates at all.

When this matters

A migration ships and traffic to the old blog falls further than anyone budgeted for. The old URL redirects to the www host, which redirects to HTTPS, which redirects to a new slug, which redirects to the trailing-slash variant: four hops to reach one page. Nothing is broken, so nothing is reported as an error, and the only way to see it is to follow the hops one at a time. The worse version of the same mistake is two rules pointing at each other, where the browser stops with a redirect error and the page is simply unreachable.

How to answer this today

Site audit follows redirects across the whole site as part of the crawl and applies the full rule set to what it finds, so chains longer than one hop, loops, and redirects that land on an error come back as issues attached to the pages that link into them. That is the view you want when auditing a migration. Checking one URL, before a rule is deployed or on a site you do not own, is the narrower job here.

Site audit

Why this is harder than it looks

A chain and a loop are different failures

A chain resolves and merely costs hops. A loop never resolves, because something in it points back to a URL already visited, and the client gives up with an error instead of a page. Counting hops finds the first. Only checking each new URL against the set already seen finds the second, and reporting both as one number buries the serious one.

The status code changes the meaning

301 and 308 both say moved permanently, but 307 and 308 preserve the request method while 301, 302 and 303 may not. Following a chain as a GET answers the question for a browser loading a page, and not for a form submission or an API call that started as a POST.

Redirects that are not in a header

A meta refresh tag or a JavaScript location assignment moves a visitor with no 3xx status at all, so a header-only trace calls the first URL the destination. These appear as a 200 that is not really the end of the chain, which is worth saying out loud rather than quietly getting wrong.

Rate limits

Following a chain means several requests to the same host in quick succession, so this runs under a per-visitor limit. The limit is what stops a stranger's URL from being turned into a stream of traffic against someone else's server, and stops the fetcher from being used as a general purpose proxy for requests the sender does not want attributed to them.