308 Permanent Redirect

The permanent, method-preserving redirect: 301's semantics with 307's strictness. POST stays POST, and clients should update stored URLs. The right choice for permanently moved API routes.

What usually causes it

  • API version/path migrations where non-GET methods matter
  • Framework-level canonical URL enforcement (Next.js redirects with permanent: true emit 308)

How to debug and fix it

  1. Very old clients (and some webhook senders) don't handle 308 — if a legacy integration breaks, front it with an exact-match 301 for GETs only.
  2. Like 301, it is cached durably; verify with 307 first if there is any doubt about the target.

Easily confused with