HTTP Status Codes
What is the difference between 301 and 308?
A 301 redirect and a 308 redirect are both permanent HTTP redirects that tell browsers and search engines a URL has moved to a new location forever. Both pass SEO equity to the destination. Both cause search engines to update their index over time. Both are cached by browsers.
For the vast majority of websites and redirect use cases, they are interchangeable. The single difference between them is how they handle the HTTP request method, and for most standard web redirects involving browser navigation, that difference is completely irrelevant.
Understanding when it does matter, however, is important for developers building APIs, handling form submissions, or managing webhook endpoints where the request method carries meaning.
What they have in common
The list of things 301 and 308 share is longer than what separates them.
Both signal a permanent move. Both instruct search engines to replace the old URL with the new one in their index over time. Both transfer link juice and ranking signals from the old URL to the new one. Both are cached by browsers, meaning future visits go directly to the destination without requesting the original URL. Both are server-side redirects processed before the page loads. And both are the correct choice any time a URL is moving permanently and will never return to its original address.
From an SEO perspective, a 301 and a 308 are treated identically by Googlebot and other major web crawlers. Choosing one over the other has no impact on how quickly search engines process the redirect or how much SEO equity is transferred.
The single key difference
The only difference between a 301 and a 308 is how they handle the HTTP request method when a browser or client follows the redirect.
A 301 redirect permits browsers to switch the request method from POST to GET when following the redirect. The HTTP specification originally said the method should be preserved, but browsers universally ignored this and switched POST to GET. This behaviour became so widespread and consistent that it is now the accepted standard. When you follow a 301 in a browser, the follow-up request will almost always be a GET regardless of what the original request was.
A 308 redirect strictly prohibits method switching. The browser must repeat the original request at the new URL using exactly the same method and the same request body. A POST stays a POST. A PUT stays a PUT. A DELETE stays a DELETE. This is not optional or browser-dependent, it is a hard requirement of the HTTP specification and all modern clients implement it correctly.
When the difference matters
For standard browser navigation, someone clicking a link, typing a URL, or being redirected from one page to another, the method difference between 301 and 308 is completely irrelevant. Browser navigation is always a GET request. There is no method to switch or preserve. A 301 and a 308 behave identically in this scenario.
The difference becomes significant in three main contexts:
API endpoints: REST APIs use a full range of HTTP methods. POST creates resources. PUT and PATCH update them. DELETE removes them. If an API endpoint is permanently moving to a new URL, a 301 will cause most clients to switch to GET when following the redirect, which breaks the API entirely. A 308 ensures the client repeats the original request (POST, PUT, PATCH, or DELETE) at the new permanent location with the full request body intact.
Webhook endpoints: webhooks are HTTP callbacks sent by third-party services, almost always as POST requests carrying a payload. If a webhook receiver endpoint is permanently moving, a 308 ensures the POST and its payload are forwarded correctly to the new URL. A 301 would cause many webhook senders to switch to GET and discard the payload, breaking the integration silently.
Form submissions: if a form’s action URL is permanently changing and the POST submission must reach the new URL with its data intact, a 308 handles this correctly. A 301 would cause the browser to switch to GET, which either loses the form data entirely or appends it to the URL as query parameters depending on the browser.
Why 301 is still the default
Despite the 308 being the technically more correct permanent redirect for method preservation, the 301 remains the default choice for the overwhelming majority of permanent redirects and for good reason.
First, browser navigation is always GET. For any redirect involving a user navigating to a page in a browser, which covers nearly all redirect management use cases, there is no method to preserve and the 308 offers no practical benefit over a 301.
Second, the 301 has decades of universal support across every browser, crawler, server, and HTTP client. The 308 is a newer addition to the HTTP specification and while all modern clients handle it correctly, some legacy systems, older HTTP clients, and certain frameworks may not. In consumer-facing contexts where broad compatibility is essential, the 301 is the safer default.
Third, the SEO treatment is identical. Choosing 308 over 301 gives you no ranking advantage whatsoever.
The 308 earns its place specifically in technical contexts (APIs, webhooks, application infrastructure) where the request method carries semantic meaning and must survive a permanent redirect intact.
How they compare to 302 and 307
It helps to see how 301 and 308 fit into the broader set of redirect status codes alongside their temporary counterparts.
The 302 redirect is the temporary equivalent of the 301, widely used, broadly compatible, permits method switching in practice. The 307 redirect is the temporary equivalent of the 308, strictly preserves the request method but signals a temporary move rather than a permanent one.
Together the four codes cover every combination of permanent versus temporary and method-switching versus method-preserving:
Permits method switch | Preserves method | |
|---|---|---|
Permanent | 301 | 308 |
Temporary | 302 | 307 |
Understanding where each code sits in this matrix makes it straightforward to choose the right one for any situation.
Which one should you use
Use a 301 when:
A page, section, or domain is moving permanently
You are redirecting HTTP to HTTPS
You are consolidating www and non-www variants
You are handling any redirect involving standard browser navigation
Broad compatibility across all clients and legacy systems is a priority
Use a 308 when:
A REST API endpoint is permanently moving and clients use POST, PUT, PATCH, or DELETE
A webhook receiver endpoint is permanently changing
A form action URL is permanently changing and POST data must reach the new URL intact
You are certain all clients in your environment support 308 correctly
When in doubt, use a 301. The method preservation that 308 provides only matters in specific technical contexts. For everything else, 301 is the right tool.
Quick reference
301 | 308 | |
|---|---|---|
Type | Permanent | Permanent |
SEO equity transfer | Yes | Yes |
Browser caching | Yes | Yes |
Index update | Yes | Yes |
Method handling | Permits POST → GET switch | Strictly preserves method |
Browser support | Universal | Modern clients only |
Best for | Page moves, migrations, HTTPS | APIs, webhooks, forms |