301 vs. 308 Redirect

301 and 308 are both permanent redirects — the core difference is that 308 guarantees the HTTP method (and the body riding with it) survive the hop. Why 308 exists, why Google and Bing process it the same way they process a 301, and when to actually reach for it.

First published: Jul 2, 2026 · Last updated: Jul 17, 2026 · Advanced
demand #11 in Redirects#27 in HTTP Status Codes#224 in Technical SEO#304 on the site
1 evidence signal on this page

A 301 and a 308 are both permanent redirects, and Google and Bing both treat 308 the same way they treat 301 for crawling, indexing, and signal purposes — Google's own docs call 308 'equivalent to 301,' Gary Illyes says 'we just merge that with 301,' and Bing's Fabrice Canel confirms Bing treats them the same. At the protocol level, the core difference is mechanical: a 308 guarantees the client repeats the same request method (a POST stays a POST, and the body rides along) against the new URL, while a 301 — an HTTP/1.0-era code — is ambiguous specifically about POST turning into GET (the RFC doesn't address PUT/DELETE either way). So for a normal page-to-page or site migration, 301 stays the pragmatic default (older, more broadly recognized, better tooling/CDN/plugin support). Reach for 308 only when you must preserve a non-GET method: API endpoints, webhook URLs, form action targets, auth POST flows — and even then, the status code alone doesn't guarantee credentials, cookies, or idempotency, so test the real client. There's no SEO advantage to either — anyone telling you to mass-migrate your 301s to 308s for a rankings bump is selling a myth the search engines have explicitly debunked.

TL;DR — 301 and 308 are both permanent redirectsA redirect sends browsers and crawlers from a requested URL to a different one. An HTTP redirect specifically is a 3xx status code paired with a Location header; meta refresh and JavaScript redirects achieve a similar navigation without being a 3xx response themselves. Permanent redirects (301/308) are Google's signal the target should be canonical; temporary ones (302/303/307) aren't., and Google and Bing both process a 308 the same way they process a 301 — Google’s docs say 308 is “equivalent to 301,” Illyes says “we just merge that with 301,” and Canel confirms Bing treats them the same. At the protocol level, the core difference is method preservation: 308 (RFC 7538, 2015) mechanically guarantees the client repeats the same method on the new URL (the body rides along with it); 301 is HTTP/1.0-era and ambiguous specifically about POST converting to GET — the RFC doesn’t address PUT or DELETE either way, so don’t generalize the POST caveat to them. 308 exists to be the permanent sibling of 307 — RFC 7231 defined a temporary method-preserving code (307) but no permanent one, and 308 filled that hole. Default to 301 for ordinary page/site/HTTPS migrationsAn HTTP to HTTPS migration is the process of moving every URL on a site from the insecure http:// scheme to the encrypted https:// scheme — installing a TLS certificate and 301-redirecting each old URL to its secure equivalent. Done correctly, it doesn't lose rankings or PageRank. (older, more broadly recognized, better CDN/CMSA content management system (CMS) is software that lets users create, manage, and publish digital content — like blog posts and pages — without writing raw code. WordPress, Drupal, and Joomla are the most common open-source CMS platforms./plugin support). Reach for 308 only when you must preserve a non-GET request — API endpoints, webhook URLs, form action targets, auth POST flows — and even then, verify credentials, cookies, and idempotency on the real client rather than assuming the status code covers them. Neither is “better for SEO” — that’s a myth the engines have explicitly debunked.

The semantic difference comes first

Both 301 and 308 tell search engines the same thing about permanence: the resource has moved for good, and the destination should become canonical. Where they differ is one narrow, mechanical guarantee about how the client re-issues the request.

  • 301 (Moved Permanently) is the original permanent-redirect code, dating to the HTTP/1.0 era. Crucially, it was always ambiguous about whether the request method must be preserved. In practice, browsers and other clients have historically converted a POST into a GET when following a 301 — which is fine for a plain page but silently breaks anything that depends on the method or the request body.
  • 308 (Permanent RedirectA 301 redirect is the HTTP status code for a permanent move: it tells browsers and search engines a URL has moved for good, and it's the strongest signal for consolidating a page's ranking signals onto the new URL. Google says permanent redirects don't cause a loss in PageRank.) is the strict version. It guarantees the client repeats the exact same method and body against the new URL. A POST stays a POST; the payload comes along for the ride.

The one-sentence framing I’d give someone: a 308 is a 301 that also guarantees the browser won’t quietly swap your POST for a GET. Evidence for this claim RFC 9110 defines both 301 and 308 as permanent redirects; 308 forbids changing the request method, while 301 permits POST-to-GET rewriting for historical reasons. Scope: HTTP semantics for 301 and 308 responses. Confidence: high · Verified: IETF: RFC 9110 §§15.4.2, 15.4.9 IETF: RFC 7538 §3 — 308 Permanent Redirect

Why 308 exists at all: the missing “permanent 307”

This is the part almost nobody explains, and it’s the cleanest way to understand the whole comparison. It’s about a gap in the spec.

The modern redirect codes come in a temporary/permanent, loose/strict grid:

TemporaryPermanent
Method may change (loose)302301
Method preserved (strict)307308

RFC 7231 defined 307 — a temporary, method-preserving redirect — as the strict counterpart to the loose, ambiguous 302. But it never defined a permanent method-preserving equivalent. There was a strict temporary code and no strict permanent one. RFC 7538 (April 2015) added 308 specifically to fill that hole: it’s to 301 what 307 is to 302. If you’ve read the 302-vs-307 comparison in this cluster, 301-vs-308 is the exact same relationship one row up — loose-permanent vs. strict-permanent.

301 predates this whole framework. It came from HTTP/1.0, before the “preserve the method” concept was formalized, which is exactly why it’s ambiguous and why 308 had to be invented rather than just clarified.

What “method and body preserved” means in practice

For the overwhelming majority of redirects — someone clicks a link, their browser issues a GET, the server sends them somewhere else — there is no practical difference. Modern browsers preserve GET on a 301 just fine. The distinction only bites when the request is not a plain GET:

Request typeBehind a 301Behind a 308
GET (a normal page)Followed as GET (in practice, fine)Followed as GET
POST (form submit, API)May be silently converted to GET, body lostRepeated as POST, body intact
PUT / DELETE (API)Not RFC-documented — historical allowance is POST→GET only, so treat as client-specific and unverifiedMethod preserved (308’s automatic-follow rule isn’t POST-specific)

So the risk with a 301 is squarely around POST and request bodies — forms, APIs, webhooks, auth flows. “A 301 will always break my form” is an overstatement; a plain GET is safe. The spec’s historical carve-out for 301 is specifically POST→GET; it doesn’t document PUT or DELETE behavior, so don’t assume either code’s handling of those methods without testing the actual client. What the spec is clear on: 308 forbids the client from changing whichever method it repeats — that rule isn’t limited to POST. Method preservation is what’s guaranteed here; it doesn’t separately promise that headers, cookies, credentials, or the wider transaction survive untouched — that’s client- and integration-specific, and worth testing on anything that matters (see the checklist below).

Does Google treat 301 and 308 differently for SEO? No.

This is the rare redirect question where the docs, the Googlers, and Bing all agree — and have agreed consistently for years.

Google’s HTTP status codes documentation puts 301 and 308 in the same bucket. The 301 row: “Google follows the redirect, and Google systems use the redirect as a strong signal that the redirect target should be processed.” The 308 row is a single line: “Equivalent to 301.” That’s the strongest, most citable statement of the answer — Google’s own docs literally equate the two. Evidence for this claim Google treats 308 as equivalent to 301 for Search while advising sites to use the semantically appropriate status code. Scope: Google Search processing; client behavior still differs when method preservation matters. Confidence: high · Verified: Google: HTTP status codes and Search

The redirects guide reinforces it, opening with “The 301 and 308 status codes mean that a page has permanently moved to a new location” and then drawing no further distinction between them anywhere.

Googlers have said the same off the record for years, well before it was written into the docs:

  • Gary Illyes (2021): in a thread about whether Google treats 308 like 301, he said Google “just merge[s] that with 301 so we really don’t care.” Barry Schwartz’s write-up framed it as the moment this became official: “Three years later it was added to the official Google documents that Google treats 308 redirectsA 308 Permanent Redirect is the HTTP status code for a permanent move that strictly preserves the request method — a POST stays a POST — and, because a compliant client repeats the same request, the body normally travels with it. For SEO it's equivalent to a 301; the difference is the method guarantee, which matters for APIs, webhooks, and form/POST traffic. like 301 redirectsA 301 redirect is the HTTP status code for a permanent move: it tells browsers and search engines a URL has moved for good, and it's the strongest signal for consolidating a page's ranking signals onto the new URL. Google says permanent redirects don't cause a loss in PageRank. — so now it is official.”
  • John Mueller (2018): three years earlier — “If you use it [a 308 redirect] like a 301 we’ll treat it as such.” So this has been Google’s informal stance since long before the docs caught up.

There’s one important nuance in Google’s docs, though, and it’s the thesis of this whole article. Right after equating the codes, Google adds: “While Google treats these status codes the same way, keep in mind that they’re semantically different. Use the status code that’s appropriate for the redirect so other clients (for example, e-readers, other search engines) may benefit from it.” In other words: pick the code for correctness and interoperability, not for SEO — because SEO doesn’t care.

Does Bing treat 301 and 308 differently? Also no.

Most write-ups on this topic are Google-only, which leaves a gap. Bing’s Fabrice Canel answered the question directly in September 2024, replying to someone asking whether Bing treats a permanent 308 the same as a 301: “Bing treats 308 redirects the same as 301 redirects.” Schwartz noted this matched what Google had said back in 2021.

So both major engines are on record: 308 is functionally identical to 301 for crawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor., indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed., and signal consolidation. There is no engine that treats 308 as SEO-superior.

The myth to bust: “308 is better for SEO / migrate all your 301s”

Let me be direct about this because lower-quality pages keep implying it. There is no SEO benefit to choosing 308 over 301 for a typical redirect, and no reason to mass-migrate your existing 301s to 308s. This isn’t my opinion; it’s the search engines’ stated position:

  • Google’s docs say 308 is “equivalent to 301.”
  • Illyes: “we just merge that with 301.”
  • Canel: Bing “treats 308 redirects the same as 301 redirects.”

Mass-swapping 301→308 buys you zero ranking upside and introduces risk on any legacy or edge tooling that only cleanly recognizes 301/302 (more on that below). It’s pure churn.

It’s worth contrasting this with a genuinely contested myth: the old “301s lose/dilute PageRankPageRank is Google's original recursive link-graph algorithm: a page's score depends on the scores of the pages linking to it, and in the published model each page's score is split across its outbound links (the simplified version: links are weighted votes). Google says it's evolved since launch but still part of its core ranking systems.” claim. That one still resurfaces and has been debunked by Google repeatedly. But notice the difference — the PageRankPageRank is Google's original recursive link-graph algorithm: a page's score depends on the scores of the pages linking to it, and in the published model each page's score is split across its outbound links (the simplified version: links are weighted votes). Google says it's evolved since launch but still part of its core ranking systems.-dilution myth is Google correcting a misconception, whereas the 301-vs-308 equivalence is Google, Bing, and the docs all stating the same thing consistently since 2018. This is a settled question, not a disputed one. (The full PageRank story lives in the 301-vs-302 comparison in this cluster.)

When 308 is the technically correct choice

Reach for 308 when losing the request method or body would break functionality (not rankings):

  • API endpoints you’re relocating, where clients issue POST/PUT/DELETE.
  • Webhook URLs — the sender POSTs a payload you can’t afford to drop.
  • Form action targets — the <form> posts data that must reach the new URL intact.
  • Auth / login POST flows where credentials or tokensA token is the smallest unit of text (or image/audio/video) an LLM processes — roughly 4 characters, or about ¾ of an English word. A context window is the maximum number of tokens (input plus output) a model can hold at once, like its short-term memory. ride in the body.

For POST specifically, a 301 risks the client converting the request to a GET and stranding the body; 308 forbids that conversion. For PUT/DELETE the RFC doesn’t spell out 301 behavior either way, so don’t assume — 308’s method-preservation rule still applies regardless of which method it is.

Before you cut over an API, webhook, or auth flow, the status code alone doesn’t guarantee everything survives the hop — worth checking as part of the same change:

  • Credentials, cookies, and auth headers. Neither code makes a promise here; test the actual client (browser, SDK, webhook sender) rather than assuming they ride along.
  • Cross-origin behavior. A redirect that crosses origins can change what a browser or fetch client will send — verify with the real caller, not just a manual curl.
  • Idempotency and duplicate side effects. If the repeated request isn’t idempotent (a webhook that creates a record, a payment POST), a client retrying after a redirect can double-fire it. Confirm the target handles a repeat safely before relying on 308 to “just work.”
  • Stage it and roll back with cache in mind. Both 301 and 308 responses are heuristically cacheable, so a client or intermediary that already cached the old response may keep using it after you change the code — test with a fresh client and one that hit the URL before your change, and have a rollback plan that accounts for that cached state rather than assuming a flip is instant.

When 301 remains the pragmatic default

For everything that’s a plain GET — which is most of what SEOs redirect — 301 stays the sensible default:

  • Standard page/URL changes and content moves.
  • Domain changes and site merges.
  • HTTP → HTTPSHTTPS is the encrypted version of HTTP — it uses TLS to authenticate the server and protect data in transit between a browser and a website. Google announced it as a lightweight ranking signal in 2014 and today conditionally prefers HTTPS pages as canonical; Chrome marks plain HTTP pages 'Not Secure.' migrations.
  • Consolidating www/non-www or trailing-slash variants.

Why default to the older code when 308 is “stricter”? Three practical reasons:

  1. Broader recognition. 301 predates 308 by two decades and is recognized by the overwhelming majority of browsers, proxies, CDNs, crawlersA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index., and analytics tools in current and legacy use. 308 is a decade-plus old now and broadly supported, but the long tail of legacy clients and edge tools is less certain — don’t assume every tool in your stack recognizes it without checking.
  2. Tooling reality. Many common tools default to — or only cleanly expose — 301/302. WordPress redirect plugins, Cloudflare’s rule builders, and some serverless/CDN platforms lean on 301/302, and a few will emit a 302/307 regardless of what you think you configured. For a non-technical site owner, “what my platform actually supports” is often the real deciding factor.
  3. Nothing to gain. Since Google and Bing process the two codes the same way for crawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor. and indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed., there’s no upside to reaching for the less-broadly-supported code on a plain page move.

The rule of thumb: plain GET → 301; non-GET request you must preserve → 308.

How to implement each

The syntax is nearly identical — you’re just changing the number.

Apache (.htaccess)

# 301 — permanent, for a normal page move
Redirect 301 /old-page /new-page

# 308 — permanent + method-preserving, for an API/form endpoint
RewriteEngine On
RewriteRule ^old-api/(.*)$ /new-api/$1 [R=308,L]

nginx

# 301
location = /old-page {
    return 301 /new-page;
}

# 308 — preserves POST body to the API
location = /old-api {
    return 308 /new-api;
}

A caveat that applies to both: some CDNs, edge platforms, and CMS plugins will not honor a 308 you configure and will emit a 301/302/307 instead. If method preservation actually matters to you, verify the response you’re really sending (curl the URL and read the status line) rather than trusting the config. Directive syntax also shifts between server versions and frameworks — check your current Apache/nginx version’s docs (or your framework’s, if it’s generating the redirect) rather than assuming the snippets above are byte-for-byte current for your setup.

A lever that outranks the 301-vs-308 choice: chain length

Whichever code you pick, the bigger performance lever is keeping redirects short. Google follows up to about 10 redirect hops before giving up, and every extra hop is latency and a chance for signals to leak. A single clean hop with the right code beats a chain of “technically correct” ones. Redirect straight to the final destination.

Where this sits

301 and 308 are the two permanent redirect codes, and each has its own deep dive in this cluster alongside their temporary counterparts (302 and its strict sibling 307) and the other-3xx member 303. The comparisons map onto a grid: 301-vs-302 is permanent-vs-temporary, 302-vs-307 is the temporary loose-vs-strict pair, and this one — 301-vs-308 — is the permanent loose-vs-strict pair. Watch out for the operational hazards too: redirect chainsA → B → C instead of A → C. Each hop loses link equity and adds latency. and redirect loopsA redirect loop is a chain of redirects that circles back on itself instead of ever reaching a live page — URL A redirects to B and B redirects back to A (or a longer cycle). No page ever returns a 200, so browsers show ERR_TOO_MANY_REDIRECTS and crawlers can't index anything.. For the whole family of server responses, see the HTTP Status Codes hubAn HTTP status code is the three-digit number a server returns with every response to tell a browser or crawler what happened to its request — success, redirect, client error, or server error. For SEO the code matters as much as the content: it tells Google and Bing whether to index a page, follow a redirect, retry later, or drop the URL from the index.; redirect type is also one of the canonicalizationHow search engines pick one canonical URL among duplicates and consolidate signals onto it. signals covered in canonicalizationHow search engines pick one canonical URL among duplicates and consolidate signals onto it..

TIP Trace the permanent redirect and preserve the method only when needed

A live trace verifies the code and destination. It cannot decide whether an API or form requires method and body preservation.

Use my Redirect Checker to confirm the permanent hop, then choose 308 only when the original request semantics must survive. Redirect Checker Free

  1. Trace the source and confirm a permanent redirect reaches the intended destination.
  2. Identify whether non-GET methods and bodies must be preserved.
  3. Use 301 for ordinary page moves or 308 for strict method preservation, then retest the real client flow.

Try it live

These are real endpoints on this site — not a simulation. Hit them from the button, open them in a new tab, or curl -i them from your terminal, and the server answers with the actual status code this article is about.

Open in new tab ↗
Open in new tab ↗

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.