HTTP 308 redirect
A 308 is the HTTP "Permanent Redirect" status code, defined in RFC 7538 (2015). It behaves like a 301 — permanent move, full link equity passed — except it preserves the original HTTP method. A POST stays a POST. The right choice for permanent redirects on APIs and form endpoints.
Long definition
The 308 status was added to fix a quirk of 301 and 302: both could legally rewrite a POST request into a GET on the redirect target, which silently broke forms and APIs. RFC 7538 standardized 308 in 2015 as the method-preserving counterpart to 301, mirroring how 307 is the method-preserving counterpart to 302.
Practical differences:
- 301 — permanent. Many clients rewrite
POST→GETon follow. - 308 — permanent. All compliant clients keep the method intact.
- 302 — temporary. Many clients rewrite
POST→GET. - 307 — temporary. All compliant clients keep the method.
For SEO, Googlebot has confirmed it treats 308 the same as 301: full canonicalization signal, full link equity. There's no bonus or penalty either way. The choice between 301 and 308 is operational, not SEO-driven.
When to use 308:
- API endpoints moving to a new path. A POST to
/v1/usersredirected to/v2/usersmust remain a POST or the client breaks. - Form submissions behind a permanent redirect.
- Webhook receivers that have changed URL.
- Any non-idempotent endpoint where the method semantically matters.
When 301 is fine:
- HTML pages crawled via GET. The method is already GET, so the rewrite-to-GET behavior is a no-op.
- Static assets (images, CSS, JS) — same reasoning.
- Sitemaps and robots.txt — also GET.
Browser support is universal in modern Chrome, Firefox, Safari, and Edge. Older HTTP libraries and SDKs occasionally lag — if you're shipping 308 to a known long-tail of legacy clients, test before flipping the switch. For most public-facing sites, 301 remains the default because the audience is browsers and crawlers, not POSTing API clients.
Common misconceptions
- "308 is better for SEO than 301." It isn't. Google treats both as full permanent canonicalization signals. The difference is purely about HTTP method preservation, which only matters for non-GET requests.
- "You should migrate all 301s to 308." Pointless effort for HTML pages — Googlebot crawls with GET, and there's no behavior to preserve. Only swap to 308 where you have actual POST/PUT/DELETE traffic going through the redirect.
- "308 is too new for production." It's been an RFC since 2015 and supported in mainstream browsers and crawlers for years. Production-safe today.
- "308 prevents redirect chains." It doesn't. Chains form from how rules are configured, not from which permanent-redirect code you pick. A 308 → 308 → 308 is just as wasteful as a 301 → 301 → 301.
Continue exploring