What HTTP 308 means
The permanent counterpart of 307: like 301, it tells clients and search engines the resource has moved for good, but a POST stays a POST. It is the safest choice for permanently moving API endpoints. Next.js and Vercel use 308 for permanent redirects by default.
Using 308 correctly
- Very old clients may not understand 308; for pages that only receive GET requests, 301 works everywhere.
Retrying
Not applicable: this isn’t an error.
Example response
HTTP/1.1 308 Permanent Redirect
Date: Wed, 21 Oct 2026 10:30:00 GMT
Location: https://api.example.com/v2/orders
How to return 308
res.redirect(308, '/new-path');
from fastapi.responses import RedirectResponse
return RedirectResponse("/new-path", status_code=308)
http.Redirect(w, r, "/new-path", http.StatusPermanentRedirect)
location /old-path {
return 308 /new-path;
}
Related status codes
- 301 Moved Permanently : The resource has a new permanent URL, given in the Location header.
- 307 Temporary Redirect : A temporary redirect that keeps the original method and body.
- 410 Gone : The resource was deliberately removed and won’t come back.
Other 3xx status codes
300 Multiple Choices · 301 Moved Permanently · 302 Found · 303 See Other · 304 Not Modified · 307 Temporary Redirect
See the full list of HTTP status codes.
Sources
Spotted a mistake? Email hello@devtoolsmith.com and we’ll fix it.
Frequently asked questions
What does HTTP 308 Permanent Redirect mean?
HTTP 308 Permanent Redirect is a permanent redirect that keeps the original method and body. The permanent counterpart of 307: like 301, it tells clients and search engines the resource has moved for good, but a POST stays a POST. It is the safest choice for permanently moving API endpoints. Next.js and Vercel use 308 for permanent redirects by default.