Key takeaways
- 301 and 308 are both permanent redirects
- For Google, they are usually equivalent
- The real difference is HTTP method handling and implementation defaults (Next
Table of Contents
Most debates about 301 vs 308 are noise.
For SEO, the deciding factors are almost always:
- one-hop redirects (no chains)
- stable destination (always the same final URL)
- destination returns 200 and is indexable
- internal links + sitemap point to the destination (not the redirecting URL)
If you want the broader consolidation model first, read:
If you are fixing Search Console coverage statuses around redirects, read:
TL;DR
Use 301 for “permanent move” in normal web pages (GET requests).
Use 308 when you want a permanent redirect and you need to preserve the HTTP method and body (POST/PUT), or you are aligning with a framework/CDN that already emits 308 for “permanent normalization”.
For Google:
- 301 and 308 are both permanent and typically consolidate signals similarly.
- If you are not ranking / not indexed, it is rarely “because you used 301 instead of 308”.
What is the difference (in one line)
- 301: permanent redirect, but user agents may change a POST to a GET (historic behavior).
- 308: permanent redirect that must preserve method + body.
If your redirect is only for normal pages (GET), the method part is irrelevant.
Does Google treat 301 and 308 differently?
In practice: rarely.
Google cares more about redirect quality than the exact permanent status code:
- single hop
- no loops
- no “sometimes to A, sometimes to B”
- no redirecting to a soft-404 destination
If you have indexing noise, start with the system-level checklist:
When 308 actually matters
1) APIs, forms, and non-GET traffic
If you redirect endpoints that can receive POST/PUT requests (forms, APIs, webhooks), 308 is safer. You do not want clients to silently convert a POST into a GET and “lose” the payload.
2) Framework defaults (Next.js) and canonicalization consistency
Some frameworks use 308 for permanent URL normalization (for example, trailing slash and other canonicalization rules).
If your stack emits 308 already, the “why not 301?” question is usually pointless: your real job is to ensure:
- the redirect is stable
- the destination is canonical and indexable
Next.js and Vercel: common gotchas
Middleware redirects default to temporary (307)
In Next.js middleware, NextResponse.redirect() is temporary by default unless you specify a status.
If you intended a permanent redirect for canonicalization, set a permanent status explicitly (301 or 308).
Automatic normalization can create chains
Typical chain patterns:
- http → https → non-www → trailing-slash rule → final
Chains are not a “penalty”, but they waste crawl and slow consolidation. Prefer a single hop where possible.
If you are cleaning up legacy URLs, also read:
How to validate (the only checklist that matters)
Step 1: confirm status and the final URL
Use curl and follow redirects:
curl -I https://casinokrisa.com/some-old-url
curl -IL https://casinokrisa.com/some-old-url
You want:
- first response: 301 or 308 (if permanent)
- last response: 200
- last response has a self-canonical (or no conflicting canonical)
Step 2: ensure internal links point to the destination
If your internal links keep pointing to the redirecting URL, Google keeps re-testing it, and you keep seeing “page with redirect” status.
Step 3: check how it shows up in GSC
Relevant statuses and what they mean:
- Page with redirect: usually fine if it is a clean one-hop to the canonical URL.
- Redirect error: loops, chains, unstable destinations, blocked final URL, or mixed protocols/hosts.
See:
FAQ
Should I change my 301 redirects to 308?
Usually no. If it is working, do not churn.
Change only if:
- you need method preservation (non-GET endpoints), or
- your stack already standardizes on 308 and you want consistency.
Is 308 “better for SEO”?
No. Redirect quality beats code choice.
What about 302 / 307?
302 and 307 are temporary. Sometimes they are correct (short-lived tests, maintenance, geo flows), but for canonicalization you usually want permanent (301/308).
If you keep seeing “crawled, currently not indexed” while also having lots of redirect noise, start here:
Next in SEO & Search
Up next:
hreflang x-default (2026): when you need it, what it fixes, and the simplest correct setuphreflang is a disambiguation system: it tells Google which language/region version to show. x-default is the “fallback” for users outside your targeted locales. Here is the minimal correct setup, common failure modes, and how to validate in GSC without cargo-culting.