308 Permanent Redirect

The HTTP 308 Permanent Redirect status code is returned by the server to indicate the requested resource has been permanently moved to a new location. The 308 status code is heuristically cacheable.

Usage

When the 308 Permanent Redirect status code is received, clients are expected to update stored links to the new URI. The new URI is specified by the Location header and is used by the client for automatic redirection.

This response is common when servers migrate to a new domain or reorganize their internal file structure with no plan to revert to the former URI.

The 308 Permanent Redirect status code differs from the 301 in one critical way: the client is required to preserve the original request method. A 301 response allows the client to change a POST request to a GET request on the redirect. A 308 Permanent Redirect requires the follow-up request to use the same method as the original. This makes 308 the correct choice when method preservation matters, such as API endpoints and form submissions.

SEO impact

Google treats 308 identically to 301. Both are permanent redirects and a strong signal the redirect target is canonical. Ranking signals transfer from the old URL to the new one. Google follows up to 10 redirect hops. Content from intermediate redirect URLs is ignored. The only difference between 301 and 308 is method preservation, which matters for API endpoints but not for search engine crawling. Redirecting deleted URLs to the homepage or a generic category page with a 308 is detected by Google as a soft 404.

Example

The client submits a POST request to an API endpoint. The server responds with 308 Permanent Redirect to indicate the endpoint has moved. The client is required to repeat the POST request, including the original body, at the new Location.

Request

POST /api/v1/orders HTTP/1.1
Host: www.example.re
Content-Type: application/json
Content-Length: 35

{"item": "widget", "quantity": 10}

Response

HTTP/1.1 308 Permanent Redirect
Location: http://www.example.re/api/v2/orders
Content-Type: text/html; charset=UTF-8
Content-Length: 118

<h1>API endpoint moved</h1>
<body>
The orders endpoint has moved to
<a href=/api/v2/orders>/api/v2/orders</a>.
</body>

Code references

.NET

HttpStatusCode.PermanentRedirect

Rust

http::StatusCode::PERMANENT_REDIRECT

Rails

:permanent_redirect

Go

http.StatusPermanentRedirect

Symfony

Response::HTTP_PERMANENTLY_REDIRECT

Python3.5+

http.HTTPStatus.PERMANENT_REDIRECT

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_PERMANENT_REDIRECT

Angular

@angular/common/http/HttpStatusCode.PermanentRedirect

Takeaway

The 308 Permanent Redirect status code indicates the resource has moved permanently and the client must preserve the original request method when following the redirect. Clients are expected to update stored links to the new Location header URI.

See also

Last updated: March 6, 2026