HTTP - Redirect (status codes 3xx) - Client must take additional action


The HTTP 3xx class of status code indicates that the client (user or user agent) must take additional action to complete the request.

The redirect url is defined by the location header.

A user agent may automatically redirect a request.



In javascript, you can redirect with the window.location.assign function


Permanent Redirect with htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$$1 [R=301,L]


300 - Multiple Choices

The client is shown with a multiple choice.

For example, the client must choose between:

  • multiple video format options,
  • different files with different extensions,
  • different word sense disambiguation.

301 - Moved Permanently

This and all future requests should be directed to the given URI.

For Googlebot, 301 means that:

  • there is a better version than a given URL.
  • this duplicate page is deprecated

You would choose this redirect when you change your domain name for instance.

For A/B test, use 302 redirects, not 301 redirects

If you’re running an A/B test that redirects users from the original URL to a variation URL, use a 302 (temporary) redirect, not a 301 (permanent) redirect.

This tells search engines that this redirect is temporary—it will only be in place as long as you’re running the experiment—and that they should keep the original URL in their index rather than replacing it with the target of the redirect (the test page). JavaScript-based redirects are also fine.

302 - Found

After a post, the response may be a 302, to indicate that:

  • the post was successful redirect
  • the next step is to show another page

With HTTP/1.0 specification, the client must perform a temporary redirect (the original describing phrase was “Moved Temporarily”), but popular browsers implemented 302 with the functionality of a 303

The browser have implemented the 303 behavior for a 302 (ie when receiving a a 302 response from POST requests will send a GET request to the Location response header)

Therefore, HTTP/1.1, added the status codes 303 and 307 to distinguish between the two behaviors. 302 is then superseded by:

  • 303
  • and 307

in HTTP/1.1 but preserved for backward compatibility.

303 - See Other URI

example of usage: used to redirect for tracking analysis For instance, after the user click on a tracking link (in an email or in on page)

A 303 response to a GET request indicates that the origin server does not have a representation of the target resource that can be transferred by the server over HTTP.

However, the Location field value refers to a resource that is descriptive of the target resource, such that making a retrieval request on that other resource might result in a representation that is useful to recipients (user generally) without implying that it represents the original target resource.

By sending a 303 when asked for a non-information resource and redirecting to an information resource about the non-information resource, the server answers the requesters information need without having to supply the actual thing 1)

Since HTTP/1.1, a 303 will always end by a GET request to the new URL from the client.

When a 303 is received in response to :

  • a GET method, the response to the request can be found under another URI
  • a POST (or PUT/DELETE), the client should presume that the server has received the data and should issue a redirect with a separate GET message.


304 - Not Modified

A 304 is send by the server when it receive a conditional get request from the client because it has already a response in its cache.

More see 304 - Not Modified HTTP Status

307 - Temporary redirect

provides a new URL for the browser to resubmit a GET or POST request.

The requested URL has been moved to a temporary location and will be back if not, uses a 302.

Used in case of A/B test for instance.

308 - Permanent redirect

provides a new URL for the browser to resubmit a GET or POST request.

Documentation / Reference

Powered by ComboStrap