
Short answer: A 3xx status code redirects or reuses a cached response; it is not automatically an error. Choose 301/308 for permanent moves, 302/307 for temporary moves, and 303 when the follow-up must be GET, then monitor the status, Location target, method behavior, and chain length. See the HTTP status code guide and MDN’s status reference.
This page is about HTTP 3xx status codes (redirects). It is not about the Roblox experience Chain 3xx.
Trace a live chain: paste any URL into the redirect checker — every hop, status code, and loop, no sign-up.
Pick the wrong redirect code and you can silently leak SEO equity, turn a POST into a GET, or cache a "temporary" redirect in browsers for months. The 3xx family looks interchangeable — they all "send the browser somewhere else" — but the differences between 301, 302, 303, 307, and 308 decide whether search engines pass ranking signals, whether the HTTP method is preserved, and whether the redirect sticks forever.
This guide explains each 3xx code, the two distinctions that actually matter (permanent vs temporary, method-preserving vs method-changing), which to use when, and how to monitor redirects so a bad one doesn't quietly cost you traffic. It completes our HTTP status series alongside 4xx client errors and 5xx server errors.
What Does a 3xx Status Code Mean?
A 3xx status code is the server saying: "What you want is somewhere else — go here instead." The new location is provided in the Location response header, and the browser (or crawler) follows it, usually automatically.
The codes differ along two independent axes:
- Permanent vs temporary — is this move forever (search engines should update their index and pass ranking signals) or just for now (keep indexing the original)?
- Does the HTTP method change? — if the original request was a
POST, does the redirect re-issue it as aPOST, or downgrade it to aGET?
Almost every redirect mistake comes from getting one of those two axes wrong.
The 3xx Codes at a Glance
| Code | Meaning | Permanent? | Method preserved? | Passes SEO signals |
|---|---|---|---|---|
| 301 | Moved Permanently | Yes | Not guaranteed (often → GET) | Yes |
| 302 | Found (temporary) | No | Not guaranteed (often → GET) | No (keeps original indexed) |
| 303 | See Other | No | No — forces GET | No |
| 307 | Temporary Redirect | No | Yes — method preserved | No |
| 308 | Permanent Redirect | Yes | Yes — method preserved | Yes |
| 304 | Not Modified (caching) | — | — | n/a (not a redirect) |
A useful mnemonic: 301/302 are the "classic" pair (method behavior historically inconsistent), while 307/308 are the "strict" modern equivalents that guarantee the method is preserved. 303 is the odd one that always switches you to GET.
301 — Moved Permanently
The page has permanently moved to a new URL. This is the workhorse of site migrations, HTTP→HTTPS upgrades, and URL restructures. Search engines transfer ranking signals to the new URL. Browsers cache 301s aggressively — often indefinitely — so never use it for anything you might reverse. Historically, browsers often changed POST to GET on a 301; if method preservation matters, use 308.
302 — Found (temporary)
The resource is temporarily at a different URL. Search engines keep the original URL indexed and generally don't pass ranking signals to the target. Using a 302 for a permanent move is a common SEO mistake. Like 301, browsers historically may switch POST to GET; for guaranteed method preservation, use 307. Use it for A/B tests, temporary promos, geo/device routing, or short maintenance detours.
303 — See Other
Tells the client to fetch the target with a GET, always, regardless of the original method. Its classic job is Post/Redirect/Get: a form POST responds with 303 to a confirmation page so a refresh doesn't re-submit. It is about controlling method, not SEO.
307 — Temporary Redirect
The strict, modern version of 302: temporary and the HTTP method and body are guaranteed preserved. A POST stays a POST. Use it for temporary redirects where the method must not change (APIs, form posts). Also what HSTS uses internally to force HTTPS.
308 — Permanent Redirect
The strict, modern version of 301: permanent and method-preserving. For a plain content page move, 301 is still the convention; reach for 308 when method preservation genuinely matters (for example, permanently relocating an API endpoint).
Which Redirect Should I Use?
A quick decision guide:
- Permanent move, want SEO to follow →
301(or308if you must keep the method). - Temporary detour →
302(or307if you must keep the method). - After a form POST, to stop re-submits →
303. - HTTP → HTTPS, www canonicalization, retiring old URLs →
301. - Never use a permanent code (
301/308) for something you might undo — the aggressive caching will haunt you.
Note on
304 Not Modified: it lives in the 3xx range but isn't a redirect. It's a caching response telling the browser its cached copy is still fresh, so no body is sent. Different mechanism entirely.
How Redirects Go Wrong (and Why Monitoring Matters)
Redirects are deploy-time configuration, which means they break silently and you rarely find out until traffic drops:
302used for a permanent move — the new URL never accrues ranking; you lose organic traffic with zero error in your logs.- Redirect chains —
A → B → C → D. Each hop adds latency and dilutes SEO signals. A migration that stacks redirects on top of old redirects is death by a thousand hops. See redirect chain monitoring. - Redirect loops —
A → B → AreturnsERR_TOO_MANY_REDIRECTSand the page is simply dead. - Accidental permanent caching — a mistaken
301that browsers refuse to forget. - Mixed HTTPS/redirect misconfig — endless HTTP↔HTTPS bouncing.
- Redirecting to a
404or5xx— the redirect "works" but lands on a broken page (4xx / 5xx).
The insidious part: a wrong redirect code returns no error. The request succeeds, the page loads — and only weeks later does the ranking drop show up in analytics. That's why redirects need active monitoring, not just a one-time check after launch. Migrations are the highest-risk moment — pair this with a migration monitoring checklist.
Practical monitoring baseline
- Assert the exact 3xx code and
Locationhost/path, not merely “any redirect.” - Fail on loops, unexpected cross-domain hops, and chains longer than your documented budget.
- Exercise non-GET requests separately because 301/302 and 307/308 differ in method preservation.
How Webalert Helps
Webalert watches your redirects so a wrong code or broken hop doesn't quietly cost you traffic:
- Status code monitoring — alert when an endpoint returns an unexpected 3xx (or a redirect that should be
301starts returning302). - Redirect chain & loop detection — catch added hops and loops after a deploy, before they bleed SEO equity. See redirect chain monitoring.
- Final-destination validation — confirm a redirect actually lands on a healthy
200, not a404/5xx. - Migration safety — verify your redirect map behaves as designed during HTTP→HTTPS or domain moves (migration monitoring).
- Fast alerting to Slack, email, and SMS the moment redirect behavior changes.
For the rest of the HTTP status landscape, see HTTP status codes explained.
Summary
The 3xx family splits along two axes: permanent (301/308) vs temporary (302/307/303) and method-preserving (307/308) vs not (301/302, and 303 which always forces GET). Use 301 for permanent moves you want SEO to follow, 302 for genuine temporary detours, 303 after form posts, and the strict 307/308 when the HTTP method must be preserved.
Get the code right, avoid chains and loops, and never use a permanent redirect for something reversible. Then monitor your redirects continuously — because a wrong 3xx throws no error and the only symptom is traffic you slowly stop receiving.
Catch a bad redirect before your rankings do
Don't wait for SEO drops to discover redirect issues. Trace a URL in the redirect checker or start free uptime monitoring to catch unexpected 3xx changes, redirect chains, and broken destinations.
Try the free plan → — 3 monitors, no credit card required. See all features and pricing.