HTTP redirect status codes
The five 3xx codes that actually redirect, what RFC 9110 says each one means, and how Google treats them.
| Code | Name | Permanent? | Request method on follow-up | Google treats it as |
|---|---|---|---|---|
| 301 | Moved Permanently | Yes | may change POST to GET | Permanent: strong canonical signal |
| 302 | Found | No | may change POST to GET | Temporary: weak canonical signal |
| 303 | See Other | No | always GET (except HEAD) | Temporary: weak canonical signal |
| 307 | Temporary Redirect | No | method and body kept | Temporary: weak canonical signal |
| 308 | Permanent Redirect | Yes | method and body kept | Permanent: strong canonical signal |
Two other 3xx codes rarely matter for redirects: 300 Multiple Choices (the server offers several representations; browsers don’t auto-follow without a Location) and 304 Not Modified (a cache revalidation answer, not a redirect). 305 Use Proxy and 306 are deprecated and unused.
Method changes, visualised
The difference between the codes that seem identical (301 vs 308, 302 vs 307) only shows when the original request isn’t a GET. Pick a code:
A browser sends POST /checkout with a form body. The server answers with…
Temporary, method may change. Same historical rewrite as 301: browsers follow a POST→302 with a GET. That accident is why 303 and 307 were created.
Redirects that aren’t status codes
A page can also redirect with a meta refresh tag, a Refresh response header or JavaScript. Google supports all three but recommends server-side 3xx redirects first. Our redirect checker detects every kind.
Sources: RFC 9110 §15.4 Redirection 3xx; Google Search Central, “Redirects and Google Search”.