seo

301 vs 308: Which Permanent Redirect Should You Use?

RC
Redirect Check Team
6 min read

If you've been writing 301 Moved Permanently for years and you're suddenly seeing 308 in your Next.js or modern framework output, you're probably wondering: what changed, and does it matter? Short answer: yes, a little. Here's the full picture.

Both are permanent. One preserves the method.

301 and 308 both tell the client "this resource has permanently moved, go here instead." The only behavioral difference is what happens with the HTTP method.

  • 301: the spec discourages changing the method, but in practice many clients downgrade POST requests to GET. This was codified as reality in RFC 7231.
  • 308: the spec requires the client to preserve the original method. A POST stays a POST. Introduced in RFC 7538 specifically to have a "permanent, method-preserving" option.

The decision tree

Scenario Pick Why
Moving an HTML page to a new URL301GET-only, widest compatibility, every tool understands it
HTTPS migration301Same as above; browsers and search engines handle it perfectly
www ↔ non-www canonical301Safe default, cacheable
Permanent API endpoint move (POST matters)308Must not downgrade the method
Form submission URL permanently moved308POST body must be replayed
Next.js permanent: true308Framework default — you get it whether you want it or not

Search engine handling

Both Google and Bing treat 301 and 308 the same way for indexing and link equity. John Mueller has said this multiple times on Twitter and in Search Console documentation. From an SEO perspective, you can use either.

What does matter for SEO:

  • Pick a canonical form and redirect consistently.
  • Keep the redirect chain to exactly one hop.
  • Don't flip back and forth between 302 and 301/308 — search engines get confused about whether the move is real.

Browser support

308 has been supported by every major browser since around 2016 (Chrome 51, Firefox 41). If you're targeting modern browsers, use either. The exception is some older corporate proxy servers and ancient HTTP libraries — if your audience includes either, stick with 301 to be safe.

What about 302 and 307?

The "temporary" counterparts follow the same pattern:

  • 302 Found: temporary, may change method (like 301).
  • 307 Temporary Redirect: temporary, must preserve method (like 308).

So the full matrix is:

Method may change Method must be preserved
Permanent301308
Temporary302307

Implementation examples

Nginx

# 301 permanent
return 301 https://example.com$request_uri;

# 308 permanent, preserves method
return 308 https://api.example.com$request_uri;

Apache

# 301
Redirect 301 /old /new

# 308 via RewriteRule
RewriteRule ^old/(.*)$ /new/$1 [R=308,L]

Node.js / Express

app.all('/old', (req, res) => {
  res.redirect(308, '/new')  // preserves POST body
})

Next.js

// next.config.js
module.exports = {
  async redirects() {
    return [
      { source: '/old', destination: '/new', permanent: true }, // emits 308
    ]
  },
}

Bottom line

For content URLs (pages, posts, images), 301 is still the right default. Widest compatibility, zero ambiguity, every crawler in the world understands it.

For API endpoints or any URL that accepts POST/PUT/DELETE and you're moving it permanently, use 308. That's the one case where the distinction actually matters — you don't want your clients silently dropping their request body.

And if you're using a framework that defaults to 308 (like Next.js), don't fight it. It won't hurt your SEO, and it's the more correct semantics for a permanent redirect. Just verify with Redirect Check that the chain is clean and your tooling handles 308 the way you expect.

지금 리디렉션을 검사하세요

잘못된 리디렉션이 SEO에 피해를 주지 않도록 하세요. 무료 도구로 링크를 즉시 감사하세요.

#seo#tutorial#redirects
이 글 공유하기: