My Service Support

3xx Status Codes: Meanings and Redirects

Updated 2026-08-25 · 960 words

What does a 3xx status code mean?

A 3xx status code tells a browser or other HTTP client that another action is needed to complete the request, usually by using a different URL. The response often includes a Location header containing the destination, but some 3xx responses have a different purpose.

A browser may follow a redirect automatically. Other clients may return the response to the user or require an option that enables redirect following. The exact behavior depends on the code, the request method, the client, and its cache.

What are the recognized 3xx status codes?

The HTTP 3xx status codes have distinct meanings. Not every code represents an ordinary redirect to a new page.

  • 300 Multiple Choices: The server has more than one possible representation or destination. The client or user may need to select one.
  • 301 Moved Permanently: The resource has a new permanent URL. Clients and search engines may replace the old URL with the destination over time.
  • 302 Found: The resource is temporarily available at another URL. Historically, clients have sometimes changed a POST request to GET while following this response.
  • 303 See Other: The client should retrieve the destination with GET, or HEAD when the original request used HEAD. This is often used after a form submission.
  • 304 Not Modified: The cached representation is still valid under the request conditions. The client should reuse its cached content; this response is not a redirect to another URL.
  • 305 Use Proxy: This code is deprecated because of security concerns and should not be used.
  • 306 Unused: This code was defined in an earlier specification but is no longer used. It is reserved and should not be assigned another meaning.
  • 307 Temporary Redirect: The resource is temporarily at another URL. The client must preserve the original request method and body when following the redirect.
  • 308 Permanent Redirect: The resource has a permanent new URL. The client must preserve the original request method and body.

Which 3xx redirects are permanent or temporary?

The important differences are whether the move is permanent and whether the request method must stay unchanged.

  • 301 and 308 are permanent: Use them when the old URL has been replaced for the foreseeable future. A 308 explicitly preserves the method and request body.
  • 302 and 307 are temporary: Use them when the original URL should remain the main address. A 307 explicitly preserves the method and request body.
  • 303 changes retrieval to GET: Use it when the next request should retrieve a separate result, rather than repeat the original operation.
  • 300 requires a choice: It indicates multiple options rather than declaring a simple permanent or temporary move.
  • 304 reuses cached content: It does not send the client to a different location.

Method preservation matters for POST, PUT, PATCH, and DELETE requests. Repeating one of these methods at the destination can submit data or trigger an operation, so a server should choose the redirect code deliberately.

How do browsers and search engines handle 3xx codes?

When a redirect response includes a valid Location header, a browser normally resolves the destination and sends another request. The address bar generally changes to the final URL, although redirect processing can fail because of a loop, a blocked request, or an invalid destination.

A redirect response can be cached when HTTP caching rules allow it. Permanent redirects are more likely to be retained, but cache directives, browser behavior, and prior cached responses all affect the outcome. A browser may therefore keep using an earlier destination after a server configuration changes.

Search engines may treat permanent redirects as a signal that the destination should replace the old URL in search results. Temporary redirects generally signal that the original URL should remain relevant. Indexing also depends on crawl access, destination content, canonical signals, redirect consistency, and other factors, so no redirect code guarantees a particular ranking or indexing result.

How can you check a 3xx response?

Browser developer tools show each request, its response status, and its headers.

  1. Open the browser's developer tools and select the Network panel.
  2. Reload the page so the browser records the full request sequence.
  3. Select the first request rather than only the final page.
  4. Read the status code in the request details.
  5. Open the response headers and find the Location header.
  6. Check later requests to see whether the browser followed the destination and encountered another redirect.

A command-line HTTP client can expose the same information. Run curl with the -I option followed by the target URL to request headers. Add the -L option to follow redirects, and use verbose output when you need to inspect every request and response. Without redirect following, the first 3xx status code and Location header are easier to isolate.

How do you fix common 3xx redirect problems?

  • Redirect loop: Trace every response in the chain. Make sure two rules do not point back to each other, and check whether protocol, hostname, slash, or capitalization rules conflict.
  • Missing Location header: Add a valid destination when the selected redirect code requires one. Confirm that an application, proxy, or server has not removed the header.
  • Invalid Location value: Check the syntax and test how relative destinations resolve from the original URL. Watch for spaces, malformed characters, and unintended hostnames.
  • Long redirect chain: Change old rules so they point directly to the final destination. Each extra response adds another request and another opportunity for failure.
  • Wrong destination: Verify the redirect rule's matching conditions, including query strings and route patterns. Test several affected URLs instead of checking only one example.
  • Unintended caching: Inspect cache-related response headers and clear the browser cache during testing. If an old permanent redirect persists, test in a fresh browser profile or with a command-line client before assuming the server still sends it.