HTTP 300 Series Codes: The Redirect Guide

So think of this scenario where you click on a link and the page opens, seems easy?

But not always cause, sometimes the page you are trying to visit isn’t actually where you think it is. There are possibilities that the website moved it to a new URL, maybe it’s temporarily available somewhere else, or maybe there are multiple versions of the same resource. Instead of leaving you stuck somewhere, the server gives your further directions on where to move next. This process is called redirection, and it’s exactly what the HTTP 300 series is designed to handle.

To understand where the 300 series comes in the spotlight, it is helpful to know that HTTP status codes are divided into five groups. The 100 series means the server is still processing the request. The HTTP 200 code series means everything worked successfully. The 400 series points to a problem with the request, while the 500 series indicates a server-side issue.

In this guide, we’ll break down all of the HTTP 300 series codes, and explain when they will appear, and show why they matter.

300: Multiple Choices

That is a 300. The server has the content in multiple forms and is asking you to pick one. Sounds useful. In practice almost nobody uses this. Browsers do not pop up a menu asking you to choose. Servers usually just pick one version and send it. So 300 mostly just sits in the spec collecting dust.

Example 300:


 HTTP/1.1 300 Multiple Choices
Content-Type: application/json

{
  "choices": [
    "/article-en",
    "/article-es",
    "/article-fr"
  ]
}
The server is saying, “There are multiple versions available. Pick one.”

301: Moved Permanently

This one is the big one. Everyone uses this one. The server says: that page is gone from the old address. Not coming back. Here is the new address. Save it. Use it from now on. Your browser listens. Next time you go to the old address, your browser does not even ask the server. It just goes to the new address on its own. Because it is remembered. You see this all the time:

A site moves from http to https. Old articles move to new URLs. A whole website changes its domain name. Big reason this matters: Google pays attention to 301s. Whatever trust and ranking the old page had, it moves to the new page through a 301. So if your site changes URLs and you do not set up 301s properly, your search rankings basically restart from zero. That is painful.

Also worth knowing: “permanent” here just means the server intends it to be forever. You can technically change a 301 later. But browsers and Google cache these hard, so changes take a long time to spread.
.

Example 301:

HTTP/1.1 301 Moved Permanently

Location: https://example.com/new-page

Anyone visiting the old URL is permanently redirected to the new one

302: Found (But Just Temporarily Over There)

302 is like your friend texting you: “I am crashing at my cousin’s place this week only. Come here for now.” The server says: go to this other address right now. But the original address is still the real one. Come back to it next time. Browsers follow a 302 but do not save it. Next visit they check again with the server.

You run into 302 during logins. You try to open a page that needs login. The site sends you to the login page first, then sends you back. That whole back and forth uses 302 a lot. Also during A/B tests. Some users get sent to a test version of a page temporarily. Once the test ends, they go back to normal. Quick side note: 302 has a weird history. It was supposed to keep the request method the same when redirecting. So POST stays POST.

But browsers started switching POST to GET automatically when following a 302. That bug basically became the standard. And that mess is why 303 and 307 had to be invented.

Example 302:

HTTP/1.1 302 Found

Location: https://example.com/login

A common example is when a user needs to log in before accessing a page.

303: See Other

303 fixes part of the 302 mess. It says: go to this new address. And when you go there, use GET. No matter what method you used before. Why does this matter? Form submissions.User fills a form. Hits submit. That is a POST. Server handles the form. Now wants to show a thank you page. If the server just sends the thank you page back directly, the user hits refresh and the form submits again. Double order. Double account. Double whatever. Not good.

So server sends a 303 pointing to the thank you page. Browser makes a fresh GET request there. User hits refresh. Only the thank you page reloads. Form does not submit again. Developers call this Post Redirect Get. You will hear that term a lot.

Example 303:

HTTP/1.1 303See Other

Location: https://example.com/order-confirmation

After a form submission, the browser is told to load a separate confirmation page using a GET request.

304: Not Modified

304 is not really a redirect. It is the server saying: you already have this. Load your saved copy. Here is the full picture. When you visit a page, your browser saves a copy of it on your computer. That is called the cache.Next time you visit, your browser does not want to download everything again if nothing changed. So it asks the server: has anything here changed since I last visited?

If nothing changed, server replies with 304. No content sent. Browser loads from cache. Page appears fast. Server did almost no work. You benefit from this every day and never notice it. Those images and CSS files that load instantly on your second visit? 304 is doing that work silently.

Example 304:

HTTP/1.1 304 Not Modified

The server is saying, “Nothing has changed. Use the copy already stored in your browser cache.”

305: Use Proxy

305 used to tell your browser to go through a specific proxy server to reach a resource. Do not use this. Ever. It got pulled from the official HTTP spec. A bad actor could use it to redirect your traffic through a proxy they control. Modern browsers completely ignore it or block it. Mentioned here only because you might see it in old documentation somewhere.

Example 305:

HTTP/1.1 305 Use Proxy

Location: http://proxy.example.com

This code is deprecated and ignored by modern browsers.

307: Temporary Redirect

307 is what 302 should have been from the start. It says: go to this other address temporarily. And keep your request method exactly as it is. POST stays POST. GET stays GET. Nothing changes on its own.For APIs this matters a lot. Say an endpoint moves for a few days. You want clients to retry their exact request at the new address. 307 does that cleanly. 302 might accidentally switch the method. Think of it this way. 302 says: go over there, browsers will probably switch to GET, whatever. 307 says: go over there, use the exact same request, no sneaky changes.

Example 307:

HTTP/1.1 307 Temporary Redirect

Location: https://api.example.com/temp-endpoint

The browser must repeat the same request method at the new URL.

308: Permanent Redirect

308 is about permanent redirects where the old address is dead. The new address is the home now. Update your links. And use the same method when you get there. Most developers just use 301 for permanent redirects because most pages use GET anyway. Method does not matter for those.308 becomes relevant when you permanently move an API endpoint and want clients to keep using POST or PUT without anything switching to GET behind the scenes.

Example 308:

HTTP/1.1 308 Permanent Redirect

Location: https://api.example.com/v2/orders

A permanent move while preserving the original request method.

Quick reference table

Code Name Simple meaning When you see it
300 Multiple Choices Pick a version Almost never
301 Moved Permanently Gone forever, update your link HTTPS switch, domain moves
302 Found Temporarily elsewhere Login flows, temp pages
303 See Other Go there but use GET After form submissions
304 Not Modified Use your saved copy Repeat page visits
305 Use Proxy Deprecated trash Old dusty docs
307 Temporary Redirect Temp move, keep method API short term moves
308 Permanent Redirect Forever move, keep method API permanent moves

Mistakes developers keep making with redirects

Stacking redirects on top of each other

Every redirect adds a round trip. You ask the server. The server says go there. You go there. Another redirect. You follow that. Finally land on the page. Three redirects stacked means three extra trips. That adds real time. Audit your redirects sometimes. If page A goes to B and B goes to C, skip the middle. Make A go straight to C.

Using 302 when the move is actually permanent

This one burns people quietly. The page loads fine in the browser so nothing looks broken. But Google does not pass ranking trust through temporary redirects the same way it does through permanent ones.

Used a 302 for a page that actually moved forever? You are bleeding SEO value every single day and not noticing it.

If the move is permanent, use 301. If you are bringing the old URL back later, use 302. That is the whole decision.

Ignoring 304 and caching

Getting cache headers right means repeat visitors load your pages way faster. Browsers skip downloading files they already have.

If your site has images and scripts and stylesheets, and people visit more than once, setting this up is worth it.

How to actually see these codes

In Chrome or Firefox:

Open any page. Press F12. Click the Network tab. Turn on the Preserve log. Refresh the page. The Status column shows you every single redirect that happened before the page loaded.

In the terminal:

bash
# See every redirect hop
curl -L -v https://example.com 2>&1 | grep “< HTTP”

# See just the final status code
curl -o /dev/null -s -w “%{http_code}” -L https://example.com

# See response headers only
curl -I https://example.com

Conclusion

300 codes will never be the most exciting topic in web development. No flashy errors. No broken screens. Just silent background trips your browser takes while you wait for pages to load. But get them wrong and you feel it. Slow load times from redirect chains you forgot about. Search rankings that dropped after a site redesign because someone used 302 instead of 301. Users submitted forms twice because 303 was never set up.

None of these are dramatic failures. They are quiet ones. The kind that cost you traffic and speed over months without a clear error message pointing at the problem. Now that you know what each code actually does, you can spot these issues before they cost you. You pick the right code the first time. You clean up old redirect chains before they pile up. You set caching up properly so 304 can do its job. Redirects are one of those things that feel tiny until they break. And once you understand them, they stop breaking.

Also Read

Get the latest tips, news, updates, advice, inspiration, and more….

Need help fixing this in your org?

Our Salesofrce experts can debug and resolve this issue quickly.