301 vs 302 Redirects: Which Status Code Should You Use?
Picture two redirects that look identical in a browser. A user clicks /old-pricing, lands on /pricing, and never notices a thing either way. To Google, those two redirects are opposite instructions. One says "the old URL is dead, transfer everything to the new one." The other says "keep the old URL; I'm just borrowing the new location for a while." Pick the wrong one and you either bleed rankings for months or hand them to a page you meant to retire.
That's the whole stakes of 301 vs 302. The mechanics are simple; the consequences of getting it backwards are not.
The one-sentence rule
If the move is permanent, use 301. If it's temporary and you want the original URL to stay the indexed, canonical version, use 302. Everything below is just applying that rule to real situations and explaining why the signal matters even in 2026, when Google's behaviour around 302s has softened.
What each code tells Google
| Code | HTTP name | What Google does with it | Link equity | |------|-----------|--------------------------|-------------| | 301 | Moved Permanently | Swaps the old URL for the new one in the index, usually within a few crawl cycles | Consolidates onto the target | | 302 | Found (Temporary) | Keeps the old URL indexed and treats it as canonical | Stays with the original URL | | 307 | Temporary Redirect | Same intent as 302, but guarantees the HTTP method is preserved (a POST stays a POST) | Stays with the original URL | | 308 | Permanent Redirect | Same intent as 301, method-preserving | Consolidates onto the target |
Two things people get wrong here. First, 307 is not "the new 302 you should always use." It exists for a narrow technical reason (preserving the request method) and matters mostly for APIs and form posts, not the marketing redirects most SEO articles are about. Second, the myth worth killing: people still claim "302s pass zero link equity." That was true years ago. Google has said for a while that a long-lived 302 eventually gets treated like a 301, and equity does flow.
So why not shrug and use 302 everywhere? Because "eventually" is doing a lot of work. While Google decides your 302 is really permanent, it keeps the old URL in results, crawls it as canonical, and delays consolidating signals onto the page you want ranking. The equity question is mostly settled; the indexing signal still costs you time. A 301 gets you there on the first pass.
Five real scenarios and the right call
Site migration / domain change. New domain, new URL structure, the old ones are gone for good. 301 every old URL to its specific new counterpart, not a blanket redirect to the homepage. A homepage catch-all tells Google the old deep pages have no equivalent, and they drop out of the index with their rankings. Map old-to-new one to one.
A/B test on a landing page. You're splitting traffic from /signup between two variants to see which converts. Use a 302 (or 307). You want /signup to remain the canonical, indexed URL. A 301 here would tell Google to de-index /signup and rank the test variant, which you may kill next week.
Scheduled maintenance / outage page. /checkout bounces to /maintenance for two hours. 302. This is the textbook temporary case. A 301 here is genuinely dangerous: Google could index /maintenance as the permanent home of your checkout flow.
HTTP → HTTPS. This is permanent. 301 every http:// URL to its https:// twin. Same for www vs non-www and trailing-slash canonicalization (/page/ → /page): pick one form, 301 the other to it, forever. These are the redirects that quietly stack into chains if each is added by a different layer; see how to fix redirect chains and loops before you layer three of them.
Geo or language routing. A US visitor hitting your global / gets sent to /en-us. Use 302 if / should stay canonical and routing is dynamic per user. If every US visitor should always live on /en-us permanently, that's a 301, but think hard, because geo-redirecting Googlebot (which crawls mostly from US IPs) can hide your localized pages entirely.
The cost of choosing wrong
302 for a permanent move: your new URL stays invisible while the old one hoards rankings. On a migration this can mean weeks of suppressed traffic: the new pages aren't consolidated, the old ones are slowly dying, and you're in limbo.
301 for a temporary move: the expensive mistake. Once Google replaces the old URL with the temporary target, undoing it requires another redirect and another wait. If you 301'd /checkout to a maintenance page and Google indexed it, you're now fighting to get /checkout back.
The asymmetry is the lesson: a wrong 301 is harder to walk back than a wrong 302, because permanence is what Google acts on aggressively.
Implementing each, correctly
# Apache .htaccess
Redirect 301 /old-page /new-page
Redirect 302 /signup /signup-variant-b
# Nginx
location = /old-page { return 301 /new-page; }
location = /signup { return 302 /signup-variant-b; }
// Next.js next.config.js, note: permanent:true emits a 308, not a 301
async redirects() {
return [
{ source: '/old-page', destination: '/new-page', permanent: true },
{ source: '/signup', destination: '/signup-variant-b', permanent: false },
];
}
That Next.js footnote trips people up: permanent: true returns 308, not 301. Google treats them equivalently, but if you're verifying with a tool and expecting "301," don't panic when you see 308; it's correct.
Verify on the wire, not in the config
Your config file says 301. That doesn't mean the response on the wire is 301; a CDN rule or framework default can override it. Check the actual header:
curl -I -L https://example.com/old-page | grep -iE "HTTP|location"
Or paste the URL into our Redirect Checker to see the full hop chain and the exact status code at each step. You're confirming three things: the right code (301/308 for permanent, 302/307 for temporary), a single hop, and a final URL that's the one you intended. If you see two or more hops, fix that next; read how to fix redirect chains and loops. For a broader walkthrough of reading status codes and spotting mixed content, see the redirect checker guide for SEO.
Frequently Asked Questions
Does a 301 redirect pass full link equity?
Effectively, yes. Google has said 301s pass nearly all PageRank, close enough to 100% that you should treat them as equity-preserving. The historical "you lose 15% per 301" figure is outdated and no longer reflects how Google handles permanent redirects.
Do 302 redirects really pass no SEO value?
That's a myth. A short-lived 302 keeps equity with the original URL, but a 302 that stays in place long-term gets reinterpreted as a 301, and equity flows to the target. The real reason to avoid 302 for permanent moves isn't lost equity; it's that Google keeps the old URL indexed and delays acting on the move.
Should I use 307 or 308 instead of 302 and 301?
Only if HTTP method preservation matters (APIs, form POSTs). For ordinary page redirects, 301 and 302 are the right, well-understood choices. 308 is fine too; Next.js and other frameworks emit it for permanent redirects, and Google treats it like a 301.
How long until Google de-indexes my old URL after a 301?
Not instantly. Expect a few weeks for the new URL to replace the old one, depending on how often Google crawls those pages. High-authority pages get recrawled faster. Keep the redirect in place indefinitely if the old URL has external backlinks.
Can I just 301 everything to my homepage during a migration?
No. This is one of the most damaging migration mistakes. A blanket redirect to the homepage tells Google the old deep pages have no equivalent, and they fall out of the index along with their rankings. Map each old URL to its closest new counterpart instead.
How do I check whether a live redirect is a 301 or a 302?
Run curl -I -L <url> and read the status line, or paste the URL into the Redirect Checker, which shows the exact code at every hop. Don't trust the config file alone; CDN and framework layers can change the code that's actually served.