Redirect Checker
Trace the full HTTP redirect chain (301, 302, 307, 308) from start to final URL.
Redirect Checker
Trace the redirect chain of any URL: the status of every hop (301, 302, 307, 308), intermediate URLs and the final page. Chains longer than 15 hops are stopped, which exposes loops.
How to Use
- Enter a URL to check the redirect chain
- Click the redirect check button
- Review the redirect chain with HTTP codes for each step
Use Cases
- Validate redirect chains after URL migrations.
- Detect unnecessary hops that waste crawl budget and time.
Limitations
- Checks one starting URL per run.
- Complex JS redirects may not appear as HTTP hops.
Example Input / Output
http://example.com/old-page
301 -> 302 -> 200, final URL: https://example.com/new-page (2 hops).
FAQ
Redirect checker: how to read the result
Paste a link and the checker follows it the way a browser does: it requests the URL, reads the Location header, moves on, and repeats until a page answers with something other than a redirect. It handles server-side 301, 302, 303, 307 and 308 responses, up to 15 hops. The top of the report shows four figures:
- Redirects: how many hops it took to reach the final page. Zero or one is normal.
- Final status: the response code of the destination, which should be 200. A 404 means the redirect leads nowhere. A 3xx after 15+ hops means a loop.
- Total time across all requests. Every extra hop adds network latency, especially on mobile connections.
- Same or different domain, which flags links that send visitors to another site.
Recommendations follow. A chain of more than two hops is flagged as too long, and two hops as worth shortening. Temporary 302, 303 and 307 codes get a suggestion to switch to 301 if the move is permanent. An http-to-https hop is marked as correctly configured. Redirects done with <meta http-equiv="refresh"> or JavaScript are not visible here: they are not HTTP responses, and search engines treat them as weaker signals than a server-side 301.
Where does this link go? Checking short and tracking links
Often the question is not about your own site but about where a link will take you. Short links (bit.ly, TinyURL), newsletter links and affiliate links pass through one or more tracking services before landing on a site. Paste one into the checker to see the destination without opening it in your own browser: our server makes the requests, not your device. The "Different domain" flag shows at a glance that the link leaves the original site, and the final URL reveals UTM tags and affiliate IDs.
The same limitation applies: some shorteners and ad networks show an interstitial page and continue with JavaScript, in which case the chain ends on that page with a 200. If the destination domain looks doubtful, check it separately before you enter details or pay for anything.
301 vs 302 vs 307 vs 308: which one to use
| Code | Meaning | Use it for |
|---|---|---|
| 301 | Moved permanently | Domain moves, URL changes, www/non-www consolidation, http → https |
| 308 | Permanent, method preserved | Same as 301 when a POST must not turn into a GET (APIs, forms) |
| 302 | Found (temporary) | Promotions, maintenance, A/B tests where the old URL will come back |
| 307 | Temporary, method preserved | Temporary moves for APIs and forms. Browsers also show a 307 when HSTS kicks in; the browser generates that one itself, not the server |
| 303 | See other | Sending the user to a "thank you" page after a form submission |
A common myth says a 302 "doesn't pass link equity". Google has stated that all server-side redirects pass PageRank. The real difference is canonicalisation: 301 and 308 are a strong signal that the new URL should replace the old one in the index, while with a 302 Google keeps the old URL for a while. A "temporary" redirect left in place for months is eventually treated as permanent, but that takes time. For migrations, use 301 or 308.
Checking redirects with curl
For a quick check from the terminal, one command is enough. -I fetches headers only, and -L follows redirects:
curl -sIL http://example.com | grep -iE "^HTTP|^location"
Each "HTTP/… code" plus "location" pair is one hop. To confirm your canonical host, test all four variants. A correctly configured site sends each one to the same URL in no more than one hop:
for u in http://example.com http://www.example.com https://example.com https://www.example.com; do
echo "$u -> $(curl -s -o /dev/null -w '%{http_code} %{redirect_url}' "$u")"
done
Mobile redirects
The checker sends its own desktop-style User-Agent. If your site sends phones to m.example.com based on User-Agent, test that with curl and a mobile header:
curl -sIL -A "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 Mobile/15E148" https://example.com/catalog/
A mobile redirect should land on the equivalent mobile page, not the homepage. Otherwise a visitor from search loses the page they clicked.
Bulk redirect check
After a migration, test the full list of old URLs. Put them in urls.txt, one per line:
while read u; do
curl -s -o /dev/null -L -w "$u\t%{http_code}\t%{num_redirects}\t%{url_effective}\n" "$u"
done < urls.txt
Look for rows where the code is not 200, where there is more than one redirect, and where the final URL is the homepage instead of the right section.
Common problems: chains, loops and www redirects
- A chain from two rules.
http://www.example.com→https://www.example.com→https://example.com. One rule forces https, another strips www, and they fire one after the other. Fix: a single rule that goes straight to the final form (examples below). - Cloudflare loop. In "Flexible" SSL mode Cloudflare talks to your server over http, the server redirects to https, and round it goes. The browser shows ERR_TOO_MANY_REDIRECTS. Switch to "Full (strict)".
- WordPress vs server conflict. Settings → General uses www, nginx strips www, and the two bounce requests back and forth. The WordPress URLs and the server rule must agree.
- Trailing slash.
/catalog→/catalog/adds a hop for every internal link written without the slash. Fix the links in your templates, not just the redirect. - Every deleted page sent to the homepage. Google treats these as soft 404s and does not carry signals over. Redirect to the closest relevant section, or return 404 or 410 if there is none.
Setting up redirects in nginx, Apache and WordPress
nginx: http and www straight to https without www, in one hop:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
# ssl_certificate ...;
return 301 https://example.com$request_uri;
}
# a single page:
location = /old-page/ { return 301 /new-page/; }
Apache (.htaccess):
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,R=301]
Redirect 301 /old-page/ https://example.com/new-page/
Behind a proxy or CDN, %{HTTPS} may always read off. Check X-Forwarded-Proto instead or you will create a loop. The .htaccess generator builds ready-made rules for common cases.
WordPress: the main domain is set in Settings → General (both address fields). For individual pages the Redirection plugin works well: it stores 301s in the database and logs 404s. After any change, test the URL here again and make sure internal links point to final URLs. The broken link checker finds links that still go through a redirect. For the background on chains and why migrations lose traffic, see how to check redirects and redirect chains.
Improve search rankings
SEO problems may be costing you traffic. Cascade link building will improve site visibility in search.