308 Permanent Redirect

What a 308 Permanent Redirect is, how it preserves the HTTP method while signaling permanence unlike a 301, and how Google passes ranking signals through it.

First published: Jun 28, 2026 · Last updated: Jul 17, 2026 · Advanced
demand #8 in Redirects#24 in HTTP Status Codes#193 in Technical SEO#267 on the site
1 evidence signal on this page

A 308 Permanent Redirect is a permanent move (same as a 301) with one strict extra guarantee: the client must not change the request method at the new URL — and because a compliant client repeats the same request rather than issuing a new one, the body travels along with it, so a POST stays a POST. For SEO it's identical to a 301: Google's docs call it 'Equivalent to 301,' Gary Illyes says Google merges it with 301, and Bing's Fabrice Canel confirms Bing treats them the same. So there's no ranking reason to pick one over the other. Reach for a 308 when you're redirecting a non-GET request that has to arrive intact — an API endpoint, a webhook, a form or auth POST — because a 301 is allowed 'for historical reasons' to silently downgrade that POST to a GET and strand the body. For an ordinary page move, HTTPS switch, or domain change (all plain GETs), 301 stays the pragmatic default thanks to broader tooling, CDN, and plugin support. Browser support is high in 2026 — caniuse currently tracks it around 96.5%+, with gaps mostly in long-dead browsers — but the caveat worth checking is your own stack: some CMS plugins, edge-rule UIs, and legacy proxies still only expose 301/302/307.

TL;DR — A 308 is the permanent, strictly method-preserving redirectA 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.: same canonicalizationHow search engines pick one canonical URL among duplicates and consolidate signals onto it. signal as a 301 (Google’s docs say “Equivalent to 301), but it guarantees the client does not change the method at the new URL — and because a compliant client repeats the same request rather than a new one, the body travels along with it. It exists because HTTP had a temporary method-preserving code (307) years before it had a permanent one — RFC 7538 (2015) filled that gap, and RFC 9110 now points to 308 directly from its own 301 definition. For SEO the two are interchangeable (Illyes: Google “merges” 308 with 301; Bing’s Canel confirms parity). Reach for 308 when a non-GET request must survive: API/version migrations, webhook URLs, auth/form POST flows — but verify method and body preservation against your own client rather than assuming it from the spec alone. Otherwise 301 stays the default — browser support for 308 is strong in 2026 (caniuse currently tracks ~96.5%+), but RFC 9110 itself still flags 308 as younger and not universally recognized, and some 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. plugins, edge-rule UIs, and legacy proxies still only expose 301/302/307.

What 308 means, mechanically

A 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. carries the same message as a 301 — this resource lives at a new URL now, permanently — with one addition the 301 never guaranteed: the client must not change the request method at the target. Because the client is repeating the same request rather than issuing a new one, the body travels along with it for a spec-compliant client — that’s a consequence of the method guarantee, not a separately certified promise, so treat it as something to verify end-to-end for your own client and server rather than assume outright. MDN describes 308 as the code that keeps the request method (and, in practice, the body) unchanged across the redirect, where a 301 may not.

The plain-English version I use in Ahrefs’ redirects guide: “A 308 redirect is the same as a 301 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., except it retains the HTTP method of the original request, GET or POST, when performing the redirect.” Or, even shorter, in the HTTP status codes guide: “308 Permanent Redirect – Has the same functionality as a 301 redirect, except you can’t switch between POST and GET.” Evidence for this claim RFC 7538 defines 308 Permanent Redirect as a permanent move whose redirect follow-up must not change the request method. Scope: HTTP semantics for 308 responses. Confidence: high · Verified: IETF: RFC 7538 §3 — 308 Permanent Redirect

Here’s the difference made concrete. Say a client POSTs an order to /api/orders with a JSON body:

POST /api/orders HTTP/1.1
Host: shop.example.com
Content-Type: application/json

{ "sku": "A-100", "qty": 2 }

If that endpoint answers with a 301 and the client honors the legacy “you may switch to GET” allowance, the request can arrive at the new URL as an empty GET — the body gone, the order lost. Answer with a 308 and the client must repeat the POST at the new URL; a compliant client carries the body along with it, so the order goes through — confirm that against your own client and server logsLog file analysis is reading a web server's raw access logs to see exactly which URLs search engine crawlers actually requested, when, how often, and what status code they got. Unlike crawl tools or Search Console, logs are the unsampled, ground-truth record of what really happened. (see the Scripts tab) rather than assuming it universally. That’s the entire practical distinction: it only surfaces when the original request wasn’t a plain GET.

Why 308 exists — the spec history

This is the part most explainers skip, and it’s the cleanest way to understand the code.

307 came first. HTTP already had a temporary, method-preserving redirect — the 307 — well before it had a permanent equivalent. The original core spec (RFC 7231) never defined a permanent counterpart to 307. So there was a temporary “keep the method” code and a permanent “you may change the method” code (301), but no permanent “keep the method” code.

RFC 7538 filled the gap. 308 was added specifically to be the missing permanent 307 — first as experimental RFC 7238 (June 2014), then standardized as RFC 7538 (April 2015). It’s a plug for a real hole, not a replacement for 301.

The current spec points straight at it. RFC 9110, today’s HTTP semantics spec, still documents 301’s built-in ambiguity — and then names 308 as the fix, inside its own definition of 301: a user agentA user agent is the HTTP request header a client (browser, crawler, or bot) sends to identify itself. For crawlers, a short user-agent token — a substring of that string — is what robots.txt rules actually target. “MAY change the request method from POST to GET for the subsequent request… If this behavior is undesired, the 308 (Permanent Redirect) status code can be used instead.” That single sentence is the whole reason 308 exists, straight from the authoritative spec. And in its own 308 section, RFC 9110 adds the one honest caveat: this code “is much younger (June 2014) than its sibling codes and thus might not be recognized everywhere.”

So 301’s POST-to-GET behavior isn’t a bug — it’s a documented “for historical reasons” allowance baked into the spec, and 308 is the officially blessed way to opt out of it.

301 vs 308 — the practical difference in one table

Plain GET requestPOST/PUT/DELETE with a body
301Behaves identically to a 308May be downgraded to GET; body can be dropped
308Behaves identically to a 301Method and body guaranteed to be repeated
SEO signalSame (permanent, consolidates)Same (permanent, consolidates)

The takeaway: for the overwhelming majority of redirects — which are plain GETs — a 301 and a 308 do the exact same thing. The guarantee only earns its keep when a non-GET method with a body is in play. (For the full head-to-head, see the dedicated 301-vs-308 comparison.)

Does Google treat 308 the same as 301 for SEO?

Yes, unambiguously, and it’s documented. Google’s HTTP status codes doc lists 301 as a redirect Google “use[s]… as a strong signal that the redirect target should be processed,” and lists 308 as simply “Equivalent to 301.” It adds a sensible caveat: “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 plain terms — Google won’t punish you for using the “wrong” one, but you should still use the one that’s correct for the request, because other software relies on the distinction.

Evidence for this claim Google treats 308 as equivalent to 301 for Search and groups both as permanent redirects. Scope: Google Search processing; the two status codes remain semantically different for HTTP clients. Confidence: high · Verified: Google: HTTP status codes and Search Google: Redirects and Google Search

Google’s redirects doc puts both codes in the same recommended tier: “The 301 and 308 status codes mean that a page has permanently moved to a new location.” And its site-move guidance names 308 explicitly rather than treating it as a 301 afterthought — the recommendation is to use permanent HTTP 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. “such as 301 and 308” when doing a permanent move.

Worth knowing: this parity wasn’t always documented. Gary Illyes has said Google merges 308 into 301 internally, and Search Engine Roundtable’s coverage frames the moment it hit the official docs as the point an informal aside finally became something you could rely on — site owners who asked “is this actually documented?” a few years back were right to be cautious even though the underlying behavior never changed. If you want the exact wording from Google and its reps, the Quotes tab has the verified pull-quotes and deep links.

Does Bing treat 308 the same as 301?

Yes. Bing doesn’t have a dedicated docs page spelling out 308 the way Google does, but Microsoft’s Fabrice Canel confirmed it directly on X in September 2024, as reported by Search Engine Roundtable: Bing treats 308 redirects the same as 301 redirects. That’s the authoritative Bing statement — see the Quotes tab for the verbatim line.

When to actually use a 308

This is where the standalone case for 308 lives — and it’s almost always a non-GET request.

API endpoint and version migrations. Moving /v1/ to /v2/, or relocating an API host, is the textbook case. Clients hit these endpoints with POST/PUT/PATCH/DELETE and real bodies. A 308 guarantees the method and payload survive the hop; a 301 risks a silent downgrade that strands the request.

POST-heavy site migrationsA site migration is any significant change to a website's URL structure, domain, platform, protocol, or hosting that can affect how search engines crawl, index, and rank it. The risk scales with how much you change at once.. Checkout flows, login/auth endpoints, and form-action targets all POST data. If any of those URLs move during a migration, a 308 keeps the submission intact where a 301 might not.

Webhook URL changes. When another service POSTs to a webhook URL you’re relocating, a 308 tells its HTTP client to re-POST to the new address with the body intact — exactly what a webhook consumer needs.

The common thread: use a 308 wherever losing the body or having the method silently drop to GET would break functionality, not just shuffle a little SEO value.

Before you flip the switch on any of these, test it like an integration, not just a status code:

  • Replay the real method and payload against a staging copy of the new endpoint.
  • Confirm whether authorization headers or cookies are supposed to carry over, and check that they actually do.
  • If the original request isn’t idempotent (a POST that creates an order, for example), watch for duplicate side effects during the redirect hop.
  • Confirm the query stringThe `?key=value` data tacked onto the end of a URL after a question mark — used for tracking, sessions, filtering, sorting, and search — and one of the biggest sources of duplicate URLs and wasted crawling in SEO. and Content-Type header survive, not just the body.
  • Verify the actual client — the webhook sender, the API SDK, the browser — automatically follows a 308 before you retire the old endpoint. Not every HTTP client does this by default.

When 301 is still the pragmatic default

For everything that’s a plain GET, 301 remains the sensible default:

  • Ordinary content/page URL changes.
  • HTTP → 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..
  • Domain changes and standard site migrationsA site migration is any significant change to a website's URL structure, domain, platform, protocol, or hosting that can affect how search engines crawl, index, and rank it. The risk scales with how much you change at once..
  • Trailing-slash and www/non-www normalization.

Here the request is a plain GET, so 308’s guarantee buys you nothing — and 301 wins on universality. There’s no SEO cost to either. Don’t mass-migrate existing 301s to 308s chasing a rankings bump; that upside doesn’t exist. Note that in the redirect-preference hierarchy from Ahrefs’ redirects guide, 308 and 301 sit together at the very top tier (ahead of meta refresh, JavaScript, and other workarounds) — they’re peers, not a ladder.

Adoption and support caveats — what’s actually a risk in 2026

Browser support is not the practical risk it once was. Per caniuse’s current tracking, 308 sits around 96.5%+ global support — check the live table for today’s number, since it shifts — and the visible gaps are concentrated in browsers that have been dead for years: pre-IE11, ancient Chrome/Firefox/Safari, old Android Browser. If you still see the old “IE11 fails on 308” warning floating around, it’s stale for mainstream traffic.

Tooling is the more current caveat. The honest, current-in-2026 gap is that not every layer exposes a 308 option. Some CMS redirect plugins, some CDN/edge redirect-rule UIs, and some older reverse proxies or load balancers still only let you pick 301/302/307. Before you commit to 308, verify the layer that actually serves the redirect can emit it rather than silently downgrading it — the Scripts tab has a one-liner to confirm the real status code on the wire. RFC 9110’s own “much younger… might not be recognized everywhere” note isn’t scoped only to browsers — it’s the spec’s general deployment caution for 308. In 2026 the practical bite of that caution shows up mostly in tooling rather than mainstream browsers, but it’s worth reading as the spec’s baseline caveat rather than something fully retired.

A non-standard footnote: “308 Resume Incomplete”

One quirk that underlines how young this code still is: 308 isn’t only a redirect code in the wild. Google Drive’s upload API reuses 308 with an entirely different meaning — “Resume Incomplete,” signaling that a chunked upload stalled and the client should resume. John Mueller flagged this himself (see the Quotes tab), and MDN documents the same non-standard usage. It doesn’t change anything about 308-as-a-redirect, but it’s a neat illustration that 308 is a newer, less culturally “settled” status code than the venerable 301.

Redirect chains and hops apply the same either way

None of the above changes how redirect chainsA → B → C instead of A → C. Each hop loses link equity and adds latency. work. Google’s 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. follow up to 10 redirect hops by default — though that’s a default, not a universal constant; Google’s own docs note specific products can differ (its URL Inspection toolA Google Search Console feature that reports how Google sees one specific URL on a property you own. By default it shows the last-indexed snapshot; a separate \"Test live URL\" mode fetches the current version., for example, doesn’t follow redirects at all), so check the current figure on Google’s docs rather than treating 10 as fixed forever. That default limit is identical whether the hops are 301s or 308s. If you’re stacking redirects (say, an old API path that hops twice before landing), the same chain-and-loop hygiene applies — collapse chains to a single hop where you can. See the dedicated redirect-chains piece for the mechanics.

TIP Verify permanence and method preservation separately

A 308 should consolidate the old URL like a 301 while preserving non-GET requests. Those are two different checks.

Trace the URL with my Redirect Checker, then replay the real API or form request to verify the body survives. Redirect Checker Free

  1. Confirm a direct 308 reaches the correct permanent destination.
  2. Check canonicals, links, and sitemaps point at the destination.
  3. Replay non-GET traffic and verify method and body preservation before retiring the old endpoint.

Try it live

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

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.