308 vs 301

Permanent Redirect vs Moved Permanently

🏠308Permanent Redirect
📦301Moved Permanently

Redirect Codes: Permanent vs Temporary

Understanding the key differences between redirect types

Permanent Redirects
📦
301
Moved Permanently
Old-Style Permanent

Classic redirect

Resource has permanently moved. Browsers and search engines will update their bookmarks and indexes.

🌐POST /old-url
Server responds with new location
📦301 → /new-url
⚠️ May change to GET
Key behavior:
  • Browser caches the redirect
  • SEO: Link juice transferred
  • ⚠️ May change POST to GET
📍
🔒
308
Permanent Redirect
Modern Permanent

Method-preserving

Like 301, but guarantees the HTTP method and body won't change during redirect.

🌐POST /old-url
Server responds with new location
🔒308 → /new-url
✓ Keeps POST method
Key behavior:
  • Browser caches the redirect
  • SEO: Link juice transferred
  • ✓ Preserves HTTP method
🔐
Temporary Redirects
🔄
302
Found
Old-Style Temporary

Classic temporary

Resource is temporarily at another location. Original URL should still be used in the future.

🌐POST /temp-moved
Server responds with temp location
🔄302 → /temp-url
⚠️ May change to GET
Key behavior:
  • No browser caching
  • SEO: Original URL preserved
  • ⚠️ May change POST to GET
⏱️
🔃
307
Temporary Redirect
Modern Temporary

Method-preserving

Like 302, but guarantees the HTTP method and body won't change during redirect.

🌐POST /temp-moved
Server responds with temp location
🔃307 → /temp-url
✓ Keeps POST method
Key behavior:
  • No browser caching
  • SEO: Original URL preserved
  • ✓ Preserves HTTP method
🔄
Quick Decision Guide
Use Permanent (301/308) when:
  • URL has changed forever
  • You want search engines to update their index
  • Domain migration or restructuring
  • Old URL should never be used again
Use Temporary (302/307) when:
  • Resource is temporarily unavailable
  • A/B testing or maintenance mode
  • You want to keep the original URL active
  • Redirect might change or be removed soon
Use Modern (307/308) when:
  • Redirecting POST/PUT/DELETE requests
  • Request body must be preserved
  • Working with REST APIs
  • Modern application with strict HTTP semantics
💡
Key Insight

Permanent vs Temporary controls caching and SEO, while Old vs Modern controls HTTP method preservation. For APIs and POST requests, prefer 307/308. For simple page redirects, 301/302 are widely supported and sufficient.

Description

The resource has permanently moved to another URI, specified in the Location header. Method and body unchanged.

When to Use
  • Permanent redirect that must preserve the HTTP method (POST stays POST)
  • API endpoints that have moved permanently
  • Preferred over 301 when method preservation is critical
Common Causes
  • API endpoint permanently moved
  • Maintaining POST method during redirect
  • Permanent URL restructuring
Description

The URL of the requested resource has been changed permanently. The new URL is given in the response.

When to Use
  • The resource URL has changed permanently and will never return
  • You want search engines to update their index to the new URL
  • Consolidating multiple URLs to a canonical URL for SEO
Common Causes
  • Website restructured with new URLs
  • Domain name changed
  • Page permanently relocated

Decision Tree

Is this redirect permanent?

Yes

Must the HTTP method be preserved (e.g., POST stays POST)?

Yes

Use 308 Permanent Redirect

Status Code: 308

No

Use 301 Moved Permanently

Status Code: 301

No

Use 302 or 307 (see 302-307 decision tree)

Status Code: 302