307 Temporary Redirect

What a 307 Temporary Redirect is, how it strictly preserves the HTTP method unlike a 302, where it shows up (HSTS, temporary moves), and how Google treats it for SEO.

First published: Jun 28, 2026 · Last updated: Jul 17, 2026 · Advanced
demand #3 in Redirects#13 in HTTP Status Codes#103 in Technical SEO#136 on the site
1 evidence signal on this page

A 307 Temporary Redirect means the same thing to Google as a 302 — a weak, temporary signal that doesn't hand the original URL's ranking over to the target — so there's no ranking reason to prefer one over the other. Its one real difference from a 302 is a spec guarantee: a 307 must not change the request method or body, so a POST stays a POST. That matters for forms, APIs, and modern frameworks (Next.js defaults to 307), and it's irrelevant for ordinary GET page redirects. The 307 that confuses most people isn't a redirect at all: it's the browser-only artifact HSTS produces when it upgrades http to https, with a 0-byte body the server never sent — a redirect checker or a plain curl request (not just a fresh incognito session, which can't override a preloaded HSTS domain) shows the real status code.

TL;DR — A 307 is a temporary redirectA 302 (\"Found\") is a temporary redirect: it forwards users to a new URL while telling search engines the original URL should stay in the index. It's a weak canonicalization signal, not the zero-equity dead end of SEO folklore. that, per RFC 9110, “MUST NOT change the request method” — the one hard guarantee a 302 doesn’t make. For SEO it’s a non-event: Google’s docs list it as “Equivalent to 302” (a weak, temporary signal), and Mueller has said the 307-vs-302 choice “doesn’t really matter” for search — it’s about whether the 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. has to work for POST/API traffic. The 307 that actually confuses people is the HSTSHSTS (HTTP Strict Transport Security) is a response header that tells browsers to always connect to your site over HTTPS — even when a user types or clicks an http:// link — closing the insecure-first-request gap that a plain 301 redirect leaves open. artifact: a browser-only, 0-byte “redirect” the server never sent, produced when the browser upgrades http to 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.' on its own. It has two functionally unrelated cases, and keeping them apart is the whole job.

A 307 has two completely different cases

This is the organizing idea for everything below, and it comes straight from my own status-codes guide, where 307 gets two separate entries: “307 Temporary Redirect – Has the same functionality as a 302 redirectA 302 (\"Found\") is a temporary redirect: it forwards users to a new URL while telling search engines the original URL should stay in the index. It's a weak canonicalization signal, not the zero-equity dead end of SEO folklore., except you can’t switch between POST and GET” and “307 HSTS Policy – Forces the client to use 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.' when making requests instead of HTTP.” They share a number and almost nothing else:

  1. 307 as a real, server-issued temporary redirect — deliberately chosen (or defaulted-to by a framework) to preserve the HTTP method and body on a non-GET request.
  2. 307 as an HSTS browser artifact — not a server response at all. The browser upgrades http to https internally and labels that upgrade a 307.

Conflating these two is the single most common source of 307 confusion. I’ll take them one at a time.

Case 1: the real 307 — what the spec actually requires

RFC 9110 (the current HTTP semantics spec) is unambiguous in §15.4.8:

“The 307 (Temporary Redirect) status code indicates that the target resource resides temporarily under a different URI and the 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. MUST NOT change the request method if it performs an automatic redirection to that URI.”

Evidence for this claim RFC 9110 defines 307 Temporary Redirect as a temporary move and requires clients not to change the request method when following it automatically. Scope: HTTP semantics for real server 307 responses, not browser-internal HSTS displays. Confidence: high · Verified: IETF: RFC 9110 §15.4.8 — 307 Temporary Redirect

That “MUST NOT” is a hard requirement, not a suggestion. Compare it to the 302 section (§15.4.3), which openly documents the historical mess 307 was created to fix: “For historical reasons, 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 307 (Temporary Redirect) status code can be used instead.” In other words, 307 exists specifically to remove the POST→GET ambiguity that older clients had with 302s.

MDN states the practical version of the same distinction:

“The difference between 307 and 302 is that 307 guarantees that the client will not change the request method and body when the redirected request is made. With 302, older clients incorrectly changed the method to GET. 307 and 302 responses are identical when the request method is GET.”

That last sentence is the one that matters most for SEO. Almost every redirect an SEO cares about — an old page to a new page — is a GET request, and for GET requests a 307 and a 302 are literally identical. The method-preservation guarantee only bites when the method isn’t GET: form resubmissions, API endpoints, webhook targets, checkout or auth POST handoffs. What the spec guarantees is the method and body — it doesn’t by itself pin down every client’s exact handling of headers, credentials, or cross-origin requests on replay, so verify those against your actual client rather than assuming byte-for-byte behavior. If you’re comparing the two codes head to head for a normal page move, that comparison is covered in depth in the dedicated 302 vs. 307 piece — this article assumes you already know the base temporary-redirect concept from the 302 redirect deep-dive and leans into what’s unique about 307.

302 vs. 303 vs. 307, in one table

All three sit in the RFC’s “temporary” bucket, but they don’t behave the same on the two axes that actually matter — method preservation and cachingCaching stores a copy of a page or resource — in a browser, a CDN edge node, or a search crawler's own cache — so it can be served again without regenerating or re-downloading it. It isn't a direct ranking factor, but it feeds page speed and crawl efficiency.:

CodeMethod on automatic redirectHeuristically cacheable?
302 FoundMay change POST to GET (historical client behavior; not an RFC requirement)No
303 See OtherA 303 See Other is a temporary HTTP redirect that tells the client to fetch a different URL with a GET or HEAD request, no matter what method the original request used. It's the mechanism behind the Post/Redirect/Get pattern, and search engines treat it as a weak signal like a 302 or 307.Deliberately retrieves the target with GET or HEADNo
307 Temporary RedirectMUST NOT change the methodNo

None of the three is heuristically cacheable by default — a 307 (like 302 and 303) needs an explicit freshness signal (Cache-Control, Expires, etc.) before a cache will store it without asking again.

Case 1, continued: how Google treats a real 307 for SEO

Short version: exactly like a 302. Google’s HTTP Status CodesAn 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. documentation lists the 307 row as “Equivalent to 302,” and the 302 row it inherits from spells out what that means:

“By default, 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 the redirect, and Google systems use the redirect as a weak signal that the redirect target should be processed.”

“Weak” is the operative word — a temporary redirect doesn’t consolidate canonicalizationHow search engines pick one canonical URL among duplicates and consolidate signals onto it. onto the target the way a permanent one does. Google’s Redirects and Google Search doc groups 302, 303, and 307 together under “temporary” and describes the behavior directly: “GooglebotGooglebot is Google's web crawler — the software that fetches pages so Google can index and rank them. It comes in two variants, Googlebot Smartphone (primary, under mobile-first indexing) and Googlebot Desktop, and runs an evergreen Chromium renderer. follows the redirect, but the 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. pipeline doesn’t use the redirect as a signal that the redirect target should be canonical.” Same page, same intent framing: “If you just want to send users to a different page temporarily, use a temporary redirect.”

Immediately after both the 307 and 308 rows, Google adds the caveat worth tattooing on the wall:

“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.”

So Google buckets 307 and 302 together for ranking, but still tells you to pick the semantically correct code. That’s the whole SEO answer. Evidence for this claim Google treats 307 as equivalent to 302 for Search while noting that the HTTP semantics differ. Scope: Google Search redirect handling; clients still need the semantically appropriate status code. Confidence: high · Verified: Google: HTTP status codes and Search John Mueller put it even more bluntly on Search Off the Record episode 51 (“Let’s talk redirects”), explaining that “with 307, 308, it also forwards POST requests” — unlike 301/302, which forward GET requests — and then landing the point:

“I think for SEO, it doesn’t really matter. It’s more like, I don’t know… Does it work for APIs or not? And usually, APIs are not something that you need to have indexed directly in Search.”

There’s no ranking upside to switching your temporary redirects to 307. The only valid reason to choose it is method/body preservation — or, as a general future-proofing preference, which I’ll get to at the end.

Case 1, continued: framework and CDN defaults

A growing share of “why is this a 307?” questions aren’t deliberate choices at all — they’re framework defaults. Next.js’s redirect() function defaults to a 307, and the docs are explicit about why, under a heading literally titled “Why does redirect use 307 and 308?”: “The redirect() method uses a 307 by default, instead of a 302 temporary redirect, meaning your requests will always be preserved as POST requests.” (Next.js uses a 303 specifically inside Server Actions, and ships a separate permanentRedirect() for the 308 case.) If you’re seeing 307s you didn’t hand-write, check whether your framework or edge platform is defaulting to them for non-GET redirects — that’s usually the answer, and usually correct.

Case 2: the HSTS “phantom 307” your server never sent

This is the genuinely under-covered territory, and where a dedicated 307 article earns its keep. When a site sends a Strict-Transport-Security (HSTS) header, it tells the browser: from now on, only ever load me over https. On the next request to the http version, the browser upgrades to https itself, without talking to the server — and displays that internal upgrade as a “307” in dev tools and 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..

John Mueller explained the mechanic on his personal site:

“After seeing the HTTPS URL with the HSTS header (for example, with any redirect from the HTTP version), Chrome will act like it’s seeing a 307 redirectA 307 (\"Temporary Redirect\") is a temporary redirect that, unlike a 302, is guaranteed by the HTTP spec to preserve the original request method and body — so a POST stays a POST. For SEO, Google treats it as equivalent to a 302. Browsers/tools also sometimes represent an HSTS-driven internal scheme upgrade as a 307, though the server never actually sent it and RFC 6797 doesn't require that specific code. the next time you try to access the HTTP page. Your server’s not returning a 307, Chrome is just showing it to you as such to explain that it’s doing the redirect for you.”

The 0-byte body is the tell — as Mueller adds, “the 307 isn’t actually a redirect at all, it’s just a placeholder.” My own redirects guide frames the practical consequence for auditing: “When web servers require clients to only use HTTPS connections (HSTS policy), Google won’t see the 307 because it’s cached in the browser. The initial hit (without cache) will have a server response code that’s likely a 301 or a 302. But your browser will show you a 307 for subsequent requests which makes it more difficult to troubleshoot. You will need to use a fresh Incognito session to see the returned status code.”

What Googlebot actually sees for HSTS (and how the story evolved)

Two Google statements, five years apart, worth reading together. Back in December 2015, Zineb Ait Bahajji (then at Google) said, per Search Engine Roundtable, “With HSTS implemented, Googlebot sees 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. (try it with Fetch as Google). The 307 is just an ‘internal redirect’.” By October 2020, Mueller’s framing in an Ask Google Webmasters video (via Search Engine Journal) was slightly different: “In short, [Googlebot] doesn’t interact with them. 307 redirects are generally not real redirects.” Either way, the crawler is not seeing the same “307” a human sees in dev tools — the tooling and crawl infrastructure changed (Fetch as Google was retired for URL Inspection), but the underlying point held for at least a decade: there’s no real server-issued 307 in the HSTS case. Treat the 2020 statement as current guidance; the 2015 one is useful history.

The important operational takeaway: HSTS is a browser convenience, not a crawl-discovery mechanism. Site owners still need a real server-side redirect (a genuine 301) for http→https if they want that path to work for crawlers.

How Bing treats a 307

Honestly? There’s a documentation gap. I found no public Bing statement that addresses 307 by name, or the HSTS-driven 307 specifically. Bing’s redirect guidance (the 2011 Managing redirects – 301s, 302s and canonicals post and the 2020 Website Migration with Bing post) only covers the 301/302 permanent-vs- temporary split — no mention of 307, 308, or HSTS. So rather than assume parity with Google, treat it plainly: Bing hasn’t said anything 307-specific publicly. The phenomenon is still real and crawler-relevant regardless of engine — Screaming Frog’s SEO Spider ships a “Respect HSTS Policy” toggle precisely because HSTS affects 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. — but that’s tooling documentation, not a Bing statement.

When to deliberately choose a 307

Pick a 307 (over a 302) whenever losing the original method or body would break something:

  • API endpoints and webhook targets that receive POST/PUT/PATCH.
  • Form-submission (POST) flows that redirect after processing.
  • Checkout / login POST handoffs between hosts.
  • Anything where the request carries a body you can’t afford to drop.

For a plain page-to-page move, a 302 and a 307 are indistinguishable to Google, so either is fine on the SEO axis. If you’re dealing with a permanent version of this same method-preservation logic, that’s the 301-vs-308 relationship — 308 is to 301 what 307 is to 302.

My own stated preference, from the redirects guide, is more opinionated than the usual “it doesn’t matter”: “my preferred order would be: 307 / 302 / 303 > Meta refresh 0 / HTTP refresh 0.” I put 307 first among the temporary options — using it consistently means you’re always safe on the method-preservation front, which is roughly the “completeness” argument Mueller made too. And whichever you choose, watch that a real 307 (or the HSTS artifact) doesn’t become one hop in a longer redirect chainA → B → C instead of A → C. Each hop loses link equity and adds latency. — every extra hop is latency and lost efficiency.

TIP Test the temporary redirect with the original request method

A 307 is defined by method preservation, so a successful GET trace is not enough evidence for a POST, upload, or API workflow.

Use my Redirect Checker for the chain, then replay the real non-GET request and inspect the destination request. Redirect Checker Free

  1. Confirm the source returns 307 and reaches the intended temporary destination.
  2. Replay the original request method and body with the actual client.
  3. Verify the destination receives them unchanged and remove the redirect when the temporary condition ends.

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.