A 302 and a 307 are both "temporary" redirects, but they are not interchangeable, and a 308 is not just "a 301 with a bigger number." The short answer: use 302 or 307 when the move is temporary and you want the original URL to keep its ranking value, and use 301 or 308 when the move is permanent. The real difference inside each pair is whether the HTTP method (GET, POST) is preserved. Getting this wrong quietly breaks form submissions, wastes crawl budget, and confuses which URL search engines and AI crawlers should index.
What each status code actually promises
Every redirect answers two separate questions: is this move permanent, and should the browser reuse the same request method? The four codes cover every combination.
- 301 Moved Permanently — permanent. Historically browsers were allowed to change POST to GET on the new URL. Signals to consolidate ranking to the target.
- 302 Found — temporary. Also historically allowed the method to change to GET. The original URL keeps its indexing value.
- 307 Temporary Redirect — temporary, and the method must not change. A POST stays a POST.
- 308 Permanent Redirect — permanent, and the method must not change.
So 307 is the "strict" version of 302, and 308 is the "strict" version of 301. The 307/308 pair exists precisely because the older codes left method handling ambiguous, and different clients behaved differently.
Why method preservation matters
Imagine a user submits a checkout form with POST to /pay, and your server redirects that request. With a 302, some clients will re-issue the request as a GET to the new URL, dropping the form body entirely, so the payment data never arrives. With a 307, the client is required to repeat the POST with its body intact. This is why API endpoints and any URL that receives POST traffic should use 307 or 308, never 302 or 301, when redirecting.
For plain content pages that only receive GET requests, the practical difference between 301 and 308, or between 302 and 307, is small. But being explicit protects you when a page unexpectedly starts receiving non-GET traffic, and it removes ambiguity for the growing list of automated clients hitting your site.
What this means for SEO and AI crawlers
Search engines and AI crawlers treat the permanent codes (301, 308) as instructions to transfer signals and index the destination. They treat the temporary codes (302, 307) as "keep the original URL indexed, this detour is temporary." The classic mistake is using a 302 for a move that is actually permanent, such as an HTTP-to-HTTPS switch or a domain change. When you do that, engines may keep the old URL in the index for far longer than necessary, splitting your authority across two addresses. For anything you intend to keep, use 301 or 308. For a genuine temporary state such as a seasonal landing page, geolocation, or maintenance, use 302 or 307. If you are planning a larger move, our guide to site migration without losing rankings and AI citations covers redirect mapping in depth.
AI crawlers add one wrinkle: many fetch fewer times and cache more aggressively than Googlebot, so a "temporary" redirect that stays in place for months may still be followed and cached as if it were permanent. Do not rely on the temporary flag to be re-checked often. If the destination is stable, say so with 301 or 308.
How to audit and fix redirects
Pull your redirects with a crawler or straight from server config and check three things. First, look for redirect chains — a URL that redirects to another URL that redirects again. Each hop costs crawl budget and dilutes signals; flatten every chain so each old URL points directly at the final destination. Second, look for the wrong permanence — 302s that have been in place for months are almost always meant to be 301s. Third, check method-sensitive endpoints — anything under an API path or that handles form POSTs should use 307 or 308.
A quick reference for common setups: in Nginx, return 301 and return 308 are explicit, and rewrite without a flag defaults to 302 behavior. In Apache, RedirectPermanent is 301 while Redirect alone is 302; you set 307/308 with an explicit status. Whatever the stack, make the status code a deliberate choice, not a framework default. For the broader picture of how these codes fit together, see our guide to HTTP status codes and redirects, and if redirects are creating duplicate addresses, our guide to canonical URLs and duplicate content.
Redirect mistakes are invisible until they cost you traffic or a conversion. The fastest way to catch a 302 that should be a 301, a chain that is bleeding crawl budget, or a header issue that hides your fix from bots is to scan the page and read what your server actually returns. Run the CheckMy.site scanner to see your redirects, status codes, and crawlability exactly as search engines and AI assistants see them.