Technical SEO

How to Check a 301 Redirect: 3 Ways That Take Under a Minute

By Published 7 min read

The fastest way to check a 301 redirect: paste the URL into our Redirect Checker and read the status code on the first hop. If it says 301 and the chain ends in a 200, the redirect is doing its job. That's the whole check, and it takes about ten seconds.

The reason a dedicated check exists at all: your browser hides everything that matters. Click a redirected link and you land on the destination either way, whether the server sent a 301, a 302, a chain of four hops, or a JavaScript trick that isn't a server redirect at all. All four look identical in the address bar. Only one of them is the permanent, link-equity-passing redirect you probably intended. Here are three ways to see what's actually happening, from zero-setup to command line.

Method 1: an online redirect checker

Paste the URL into the Redirect Checker. You get the full hop chain: every intermediate URL, the status code for each hop, and the final destination with its response code. This is the method to use when you want the complete picture in one shot, and the only sane method when you suspect a chain, because it shows all the hops at once instead of making you follow them manually.

What you're looking for, in order:

  1. The first status code is 301 (or 308, which is fine; more on that below), not 302 or 307.
  2. One hop. The source URL goes straight to the final URL, not through intermediate stops.
  3. The chain ends in 200. A redirect pointing at a 404 or another redirect is a problem regardless of its own status code.
  4. HTTPS stays HTTPS. A hop that downgrades to http:// mid-chain is both a security smell and wasted crawl work.

Method 2: curl -I in a terminal

If you're comfortable in a terminal, curl shows you exactly what the server sends, with nothing interpreting it in between:

curl -I https://example.com/old-page

The first line of the response is the verdict: HTTP/2 301 means permanent redirect, and the location: header below it shows where it points. To follow the whole chain the way a crawler would, add -L to follow redirects and keep -I so you only see headers; each hop prints its own status line, so a chain is immediately visible as multiple 301 blocks stacked on top of each other.

Two flags worth knowing: curl -A "Googlebot" sets the user agent, which catches servers configured to redirect bots differently than people (rare, but nasty when it happens), and adding -H "Accept-Language: de" catches geo/language-based redirects that only fire for certain visitors.

Method 3: browser DevTools

Open DevTools (F12), switch to the Network tab, tick "Preserve log" (redirects clear the log otherwise, which is the step everyone misses), then load the URL. The first row shows the original request; its Status column reads 301, and clicking it reveals the location response header. Subsequent rows show each hop in the chain.

This method's advantage is context: you see the redirect plus everything the destination page loads afterward, which helps when you're debugging why a redirected page also behaves oddly. Its disadvantage is that browser caching lies to you. Chrome caches 301s aggressively, so a redirect you changed on the server five minutes ago may still show its old target in your browser. Test in an incognito window, or use method 1 or 2, which don't cache.

Decoding what you find

| Result | Meaning | Action | | --- | --- | --- | | 301 → 200 | Permanent redirect, clean landing | Nothing. This is the goal. | | 308 → 200 | Permanent redirect that also preserves POST requests | Nothing. Equivalent to 301 for SEO. | | 302 or 307 → 200 | Temporary redirect | Change to 301 if the move is permanent. 301 vs 302 explained. | | 301 → 301 → 200 | Redirect chain | Point the first URL directly at the final one. How to fix chains and loops. | | 301 → 404 | Redirect to a dead page | Fix the target. This drops visitors and link equity on the floor. | | 301 → 301 → 301 → ... | Loop | The browser gives up with ERR_TOO_MANY_REDIRECTS. Fixing that error. | | 200 with a delay, then new page | Meta-refresh or JavaScript "redirect" | Replace with a real server-side 301. Crawlers treat these as weak signals at best. |

The 308 case trips people up most. Some hosts and CDNs (Netlify, some Cloudflare configurations, Next.js defaults) send 308 where you configured a "permanent" redirect. That's not a misconfiguration; 308 is the stricter modern sibling of 301, and Google treats both as permanent. Don't burn an afternoon trying to force a 301 out of a platform that emits 308s.

Checking 301s in bulk

After a migration you don't have one redirect, you have four hundred. Nobody pastes those one at a time. The workflow that works: build a two-column sheet of old URLs and their expected targets, then loop the list through curl and record the first status code and final landing URL for each row. A shell one-liner reading from a file handles it, or a desktop crawler like Screaming Frog in list mode does the same with a UI. Flag every row where the status isn't 301/308, the final URL doesn't match your expected target, or the hop count exceeds one.

Do this twice: once when the migration ships, and again a month later. The second pass catches redirects that someone "cleaned up," CMS plugins that quietly rewrote rules, and chains that formed when a redirect target itself got redirected.

Why the 301/302 distinction is worth a check at all

Because the two codes tell Google opposite things. A 301 says "the old URL is gone for good, transfer its history and rankings to the new one." A 302 says "temporary detour, keep the old URL indexed and expect it back." Google has gotten better at inferring intent when sites use the wrong one, but "Google will probably figure out what I meant" is a poor foundation for a migration. The check takes ten seconds; the ambiguity can linger for months.

For the deeper audit workflow, reading hop chains, mixed-content traps, and knowing when an imperfect redirect is fine to leave alone, see the full redirect checker guide.

Frequently Asked Questions

How do I know if a redirect is a 301 or 302?

You have to look at the HTTP status code; the browser behaves identically for both. Paste the URL into a redirect checker, or run curl -I on it and read the first response line. "Moved Permanently" is 301, "Found" is 302.

Can I check a 301 redirect without any tool?

Yes, with what's already on your machine: curl -I <url> in any terminal shows the status code and Location header, and your browser's DevTools Network tab (with "Preserve log" enabled) shows the full chain. A dedicated checker just presents the same data faster and without cache interference.

Why does my redirect show 308 instead of 301?

Your platform chose the modern equivalent. 308 is a permanent redirect like 301, with one technical difference: it forbids changing the request method (a POST stays a POST). Next.js, Netlify, and several CDNs emit 308 by default for permanent redirects. Google treats 301 and 308 the same, so there's nothing to fix.

How many redirect hops are too many?

Aim for one. Google publicly states its crawler follows up to ten hops before giving up, but every extra hop adds latency for users and dilutes the clarity of the signal. Chains usually form by accretion, an old redirect pointing at a URL that later got redirected itself, and the fix is pointing every old URL directly at the current final destination.

Yes. Google has confirmed that 301 (and 302, and 308) redirects pass PageRank without the loss that older SEO writing assumed. The practical risks are elsewhere: chains, redirects to irrelevant pages (which Google may treat as soft 404s), and redirects to error pages, which pass nothing because there's nothing to land on.

Related Guides

Put this knowledge into action

Analyze your website with our free SEO tool and get instant recommendations.

Analyze Your Website