Qaynaq LABS · TOOLS

HTTP · 3xx Redirection

308 Permanent Redirect

Resource permanently moved to a new URI; future requests must use the new URI.

When you see this status

  • Resource permanently relocated to a new URL
  • API versioning with permanent migration
  • Domain or path restructuring
  • SEO-friendly URL updates

Common causes

  • Server-side resource relocation
  • Deprecated API endpoints
  • URL normalization changes
  • Domain consolidation

How to debug it

  1. Verify the Location header contains the correct new URI
  2. Check if client follows redirects automatically
  3. Inspect browser/network tab for redirect chain
  4. Test with curl -v to see headers

Return this code in your framework

Express (Node.js)
res.redirect(308, 'https://new.example.com/resource');
FastAPI (Python)
return RedirectResponse(url="https://new.example.com/resource", status_code=308)
NestJS
@Get() @Redirect('https://new.example.com/resource', 308) getRedirect() {}
Go (net/http)
http.Redirect(w, r, "https://new.example.com/resource", http.StatusPermanentRedirect)

About HTTP 308

HTTP status code 308 Permanent Redirect is part of the 3xx Redirection family. Resource permanently moved to a new URI; future requests must use the new URI. Understanding it is essential for backend engineers, API designers, and anyone debugging integrations between services.

The Qaynaq Labs HTTP Status Code Explainer covers all standard codes with practical guidance: what triggers them, how to debug them in production, and exactly how to return them from common frameworks. Each code page is hand-curated and verified.

Frequently asked

Does 308 preserve the HTTP method?

Yes. Unlike 301/302, 308 requires the client to preserve the original method (e.g., POST remains POST).

Can browsers cache 308 redirects?

Yes. Browsers cache 308 redirects permanently, similar to 301. Use 307 for temporary redirects.

How do search engines treat 308?

Search engines transfer link equity to the new URL permanently, like 301. Use for SEO migrations.