HTTP redirect status codes

The five 3xx codes that actually redirect, what RFC 9110 says each one means, and how Google treats them.

CodeNamePermanent?Request method on follow-upGoogle treats it as
301Moved PermanentlyYesmay change POST to GETPermanent: strong canonical signal
302FoundNomay change POST to GETTemporary: weak canonical signal
303See OtherNoalways GET (except HEAD)Temporary: weak canonical signal
307Temporary RedirectNomethod and body keptTemporary: weak canonical signal
308Permanent RedirectYesmethod and body keptPermanent: 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…

POST /checkout + body
302 Location: /pay
GET /pay body dropped

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