307 Temporary Redirect: a 302 that keeps the method
307 Temporary Redirect sends the client to another URL for now and requires it to repeat the same method and body there.
307 Temporary Redirect sends the client to another URL for now and guarantees that the request method and body stay the same. A POST that hits a 307 is re-sent as a POST to the new location, which is the one thing 302 never promised.
Definition
RFC 9110, section 15.4.8 says the target resource resides temporarily under a different URI and the user agent “MUST NOT change the request method” if it follows the redirect automatically. Because the redirect is temporary, clients keep using the original URL for future requests. 307 was added in HTTP/1.1 to remove the ambiguity of 302, whose method handling varied between clients.
SEO impact
For Google, 307 is equivalent to 302, according to its HTTP status code documentation. Googlebot follows it, and the redirect is a weak signal that the target should be canonical, so the original URL usually stays in results. That’s correct for a temporary detour and wrong for a permanent move; use 308 or 301 for those.
The “307 Internal Redirect” in Chrome
Many people first meet 307 in the browser’s Network panel: http://example.com shows 307 Internal Redirect with Non-Authoritative-Reason: HSTS. That response never came from your server. The browser has your site on its HSTS list and upgrades the request to HTTPS by itself before sending anything. Googlebot and server-side tools don’t share that browser state, so they see what your server really sends for the http:// URL, ideally a single 301 or 308 to HTTPS. Don’t try to “fix” an internal redirect; check the real response instead.
Where real 307s come from
- Frameworks: Next.js uses 307 for redirects with
permanent: falseand 308 forpermanent: true; FastAPI’sRedirectResponsedefaults to 307. - APIs moving traffic temporarily to another endpoint while keeping POST, PUT or DELETE intact.
- Load balancers and authentication gateways that route users through a login step.
If a framework default turned a permanent change into a 307, switch it explicitly:
// next.config.js
module.exports = {
async redirects() {
return [
{ source: '/blog/:slug', destination: '/articles/:slug', permanent: true }, // 308
];
},
};
# Nginx: a deliberate temporary redirect that keeps the method
location = /api/v1/upload {
return 307 https://upload.example.com/api/v1/upload;
}
How to check
Use the redirect checker to trace the real server-side hops for a URL, including the http-to-https step that Chrome hides behind HSTS. The HTTP header checker shows the Location and caching headers of a single response. A genuine 307 looks like this:
HTTP/1.1 307 Temporary Redirect
Location: https://upload.example.com/api/v1/upload
Cache-Control: no-store
Content-Length: 0 Frequently asked questions
Is a 307 redirect bad for SEO?
No, as long as the move is temporary. Google treats 307 like 302 and normally keeps the original URL in results. For permanent moves, use 301 or 308.
Why does Chrome show a 307 when my server sends a 301?
That “307 Internal Redirect” is generated by the browser because of HSTS: it upgrades http to https before contacting your server. Search engines and server-side checkers see your server’s real response.
Should I use 302 or 307?
For simple page redirects, Google handles both the same way. Choose 307 when the client must repeat the same method, for example a POST to an API endpoint that has moved temporarily.