Redirection
308

Permanent Redirect

The resource has been permanently moved to a new URI, and the client must preserve the original HTTP method.

# Quick Definition

The 308 Permanent Redirect status code indicates that the target resource has been assigned a new permanent URI. Unlike a 301, the 308 requires the client to preserve the original HTTP method and request body when following the redirect. A POST remains a POST, a PUT remains a PUT -- the method is never changed to GET.

# When Does a 308 Redirect Occur?

A 308 redirect is used when a resource has permanently moved to a new URL and it is critical that the HTTP method be preserved during the redirect. This is particularly important for API endpoints where clients send POST, PUT, or DELETE requests -- changing these to GET (as 301 allows) would break the intended operation.

Common scenarios include API version migrations (e.g., /api/v1/users permanently moving to /api/v2/users), domain changes for API services, and restructuring URL paths for endpoints that accept non-GET methods.

# Common Use Cases

# Best Practices

  1. Use 308 instead of 301 for APIs -- If your API endpoints accept POST, PUT, or DELETE requests, always use 308 to ensure clients don't silently change the method to GET when following the redirect.
  2. Keep 301 for browser-facing content -- For web pages that only serve GET requests, 301 is perfectly fine and has broader legacy support. Reserve 308 for cases where method preservation matters.
  3. Update API documentation promptly -- While the 308 redirect ensures backward compatibility, update your documentation to point to the new URL so clients can update their code.
  4. Set appropriate cache headers -- Since 308 is permanent, clients and intermediaries will cache it. Ensure your Location header is correct before deploying, as correcting a cached 308 is difficult.
  5. Test with all HTTP methods -- Verify that POST, PUT, PATCH, and DELETE requests all follow the redirect correctly with method and body intact.

# HTTP Example

Request
POST /api/v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json

{
  "name": "Jane Doe",
  "email": "jane@example.com"
}
Response
HTTP/1.1 308 Permanent Redirect
Location: https://api.example.com/api/v2/users
Client Follows Redirect (Method Preserved)
POST /api/v2/users HTTP/1.1
Host: api.example.com
Content-Type: application/json

{
  "name": "Jane Doe",
  "email": "jane@example.com"
}

# Related Status Codes

# Frequently Asked Questions

What is the difference between 308 and 301?+
Both 308 and 301 indicate a permanent redirect, but they handle HTTP methods differently. A 301 Moved Permanently allows the client to change the request method from POST to GET when following the redirect (and most browsers do). A 308 Permanent Redirect requires the client to use the exact same method and body when following the redirect. Use 308 when you need POST, PUT, or DELETE requests to be preserved through the redirect.
Do all browsers support 308?+
Yes, all modern browsers support 308 Permanent Redirect, including Chrome, Firefox, Safari, and Edge. It was standardized in RFC 7538 (2015). However, very old browsers or HTTP clients may not recognize 308 and could treat it as a generic 300-level redirect. For maximum compatibility with legacy clients, 301 is safer, but for APIs and modern web applications 308 is the correct choice when method preservation matters.
Does 308 pass SEO value like 301?+
Yes, search engines treat 308 the same as 301 for SEO purposes. Both are permanent redirects that pass link equity (ranking signals) from the old URL to the new one. Google has confirmed that 308 is handled identically to 301 in terms of PageRank transfer and URL canonicalization.

Verify your redirects are working

Monitor redirect chains, track method preservation, and detect broken API redirects instantly.

Start Free Monitoring