# 308 Permanent Redirect: a method-safe 301

> 308 Permanent Redirect moves a resource to a new URL for good and requires clients to repeat the same request method there.

URL: https://yes-seo.com/http-status-codes/308

**308 Permanent Redirect** says a resource has moved for good and that the client must repeat the same request, with the same method and body, at the new URL. Think of it as a 301 that is strict about methods.

## Definition and history

308 was first specified in 2014 (RFC 7238, then RFC 7538) and is now part of [RFC 9110, section 15.4.9](https://www.rfc-editor.org/rfc/rfc9110#section-15.4.9). The target has a new permanent URI, clients should use it in future, and a user agent following the redirect must not change the request method. Like a 301, a 308 is cacheable by default.

The only difference from [301](https://yes-seo.com/http-status-codes/301) is method handling: with a 301, clients may turn a POST into a GET for historical reasons; with a 308, a POST stays a POST. Its temporary sibling is [307](https://yes-seo.com/http-status-codes/307).

## SEO impact

[Google’s documentation on HTTP status codes](https://developers.google.com/search/docs/crawling-indexing/http-network-errors) lists 308 as equivalent to 301: Googlebot follows it and treats it as a strong signal that the target is the canonical URL. Signals consolidate on the new address, and the old URL drops out of results over time. Google’s general redirect advice still applies: one hop rather than a [chain](https://yes-seo.com/glossary/redirect-chain), a relevant destination, and redirects kept for at least a year after a site move.

Google also notes that although it treats several redirect codes the same way, they mean different things, so pick the code that describes what’s happening for the benefit of other clients. For permanent page moves, both 301 and 308 are correct.

## Where 308s come from

- **Next.js**: redirects with `permanent: true` and the automatic trailing-slash normalization use 308.

- **APIs** that moved an endpoint and need clients to keep sending POST or PUT.

- **Hand-written rules** where a developer chose 308 deliberately.

A few very old clients didn’t recognize 308. That’s rarely a concern today, but if you must support legacy devices, 301 is the safer choice for plain page moves.

## How to send a 308

```
# Nginx: keep the rest of the path and the query string
location ~ ^/api/v1/(.*)$ {
    return 308 https://api.example.com/v1/$1$is_args$args;
}

# Apache mod_alias (accepts any 3xx code)
Redirect 308 /api/v1/ https://api.example.com/v1/

# Apache mod_rewrite
RewriteRule ^docs/(.*)$ https://docs.example.com/$1 [R=308,L]
```

## How to check

Trace the hops with the [redirect checker](https://yes-seo.com/redirect-checker) and confirm the chain ends on a 200 page in one step. For a batch of migrated URLs, the [HTTP status checker](https://yes-seo.com/http-status-checker) lists each code and target. Then confirm the destination is self-canonical with the [canonical checker](https://yes-seo.com/canonical-checker). A 308 response:

```
HTTP/2 308
location: https://www.example.com/docs/
content-type: text/plain
content-length: 0
```

## Frequently asked questions

### Is a 308 redirect as good as a 301 for SEO?

Yes. Google’s documentation lists 308 as equivalent to 301: both are strong signals that the target should be canonical.

### Why does my site return 308 instead of 301?

Your framework or host probably chose it. Next.js, for example, uses 308 for permanent redirects and trailing-slash normalization. It isn’t a problem for SEO.

### Do browsers cache 308 redirects?

Yes, like 301s they are cacheable by default, so a mistake can stick in visitors’ browsers. While testing a new redirect, send a short Cache-Control lifetime.

