301 vs 307: Moved Permanently vs Temporary Redirect
301 and 307 can look similar in logs, but they tell clients, crawlers, and API consumers different things.
| Aspect | HTTP 301 — Moved Permanently | HTTP 307 — Temporary Redirect |
|---|---|---|
| Definition | The resource at the requested URL has permanently moved to the URL in the Location header. Browsers and crawlers update their records. Search engines transfer ranking signals to the destination. | Unlike 302, a 307 requires the client to repeat the request to the new URL with the same method and body. Use this when method preservation matters for temporary redirects. |
| Plain-language summary | The resource has permanently moved to the URL in the Location header. Browsers and search engine crawlers update their internal records to the new URL. SEO signals (PageRank, links) are transferred to the destination. Use this only when the move is truly permanent — reversing a cached 301 is difficult. | Temporary redirect with mandatory method preservation. The client must repeat the request to the Location URL using the same HTTP method and body. If the original was a POST, the repeat must also be a POST. This is the spec-correct version of 302 for cases where method preservation matters. |
| When to use | Use 301 for: permanent domain migrations (http→https, www→non-www, domain renames), permanent URL restructuring, consolidating duplicate URLs to a canonical. Do not use 301 for temporary campaigns, A/B tests, or login flows — use 302 or 307 for those. Use 308 if you need to preserve the HTTP method (POST stays POST) on a permanent redirect. | Use 307 when: you need a temporary redirect AND the HTTP method must be preserved (e.g., a POST to /checkout being temporarily routed to /checkout-v2). Use 302 when method preservation does not matter or when you accept the browser's POST→GET behavior. Use 308 for permanent redirects with method preservation. |
| Client behavior | Browsers cache the redirect aggressively and follow it automatically, typically changing POST to GET (historical behavior). Search engine crawlers follow and pass link equity to the destination. Most HTTP clients follow redirects by default; some have a max follow depth (commonly 5–10 hops). | Client repeats the full request (same method, same body, same headers) to the Location URL. Browsers prompt for confirmation before re-sending a POST body. Unlike 302, a POST remains a POST. Not cached. |
| Caching behavior | Cached by browsers and CDNs indefinitely unless Cache-Control or Expires specifies otherwise. Once cached, clients will not hit the original URL again until cache expiry. This makes 301s easy to deploy but hard to roll back — test before shipping. | Not cached by default. Like 302, temporary redirect responses are not stored unless you explicitly add caching headers (rarely appropriate). |
| SEO / crawler impact | Search crawlers interpret 301 (redirect-codes) for indexation and link equity accordingly. | Search crawlers interpret 307 (redirect-codes) for indexation and link equity accordingly. |
| API / backend impact | API clients branching on 301 expect Moved Permanently semantics. | API clients branching on 307 expect Temporary Redirect semantics. |
| Safe to retry? | Follow redirect, then retry original intent | Follow redirect, then retry original intent |
Common real-world scenarios
When you see HTTP 301
Common in access logs during site migrations, HTTPS enforcement, and URL canonicalization. Watch for: redirect chains (A→B→C — each hop adds latency and some crawlers have hop limits), redirect loops (A→B→A — will show as 301 thrashing in logs), and 301s that land on 404 (the redirect was set up but the destination does not exist).
When you see HTTP 307
Less common than 302 in typical web applications but important in API gateways and service meshes where POST/PUT/DELETE requests need temporary routing changes. Used in HTTPS enforcement where method preservation matters for POST endpoints.
Decision rule
Use 301 when the response should communicate moved permanently behavior; use 307 when temporary redirect is the accurate protocol signal.
A frequent mistake is swapping 301 and 307 for convenience; that causes client retry bugs, incorrect cache signals, and misleading monitoring data.
Use 301 when the correct protocol signal is Moved Permanently. Use 307 when the correct signal is Temporary Redirect. Returning either code for the wrong reason breaks client expectations, cache behavior, and monitoring accuracy.
FAQ
What is the biggest difference between 301 and 307?
301 communicates Moved Permanently, while 307 communicates Temporary Redirect. Choosing the right one keeps clients and intermediaries predictable.
Do 301 and 307 have SEO or caching impact?
Yes. Search engines and caches interpret status classes differently. Use each code according to its semantics to avoid accidental indexing, stale responses, or crawl inefficiency.
Can APIs safely return 301 instead of 307?
Only when it matches contract semantics. API clients often branch logic by exact code, so swapping them can break retries, auth handling, or user-facing errors.
Full guides
HTTP 301 Moved Permanently — full guide · HTTP 307 Temporary Redirect — full guide · All comparisons · HTTP 301 status reference · HTTP 307 status reference