HTTP Status 301 (Moved Permanently)

HTTP Status 301 is one of the redirection related statuses, which indicates that the resource requested has been permanently moved to the URL given by the Location header. And all the future requests should use the new URI.

Redirection is the process of forwarding the request from one URL to a different URL. The specification for Status 301 requires the request method (and the request body) not to be altered when the redirection is performed.

It is recommended to use HTTP 301 only for GET or HEAD methods.

1. Why a URL needs to move permanently?

Generally, changing the URLs of resources is not advisable. Still, we can come across unavoidable situations where we must be making the changes to the URL of a resource.

A few such examples can be:

  • Moving the resource from HTTP to HTTPs protocol
  • Resource has been discountinued and alternate resource is available in new URL

2. Location Header

The server SHOULD generate a Location header field in the response containing the new location of the resource.

2.1. Client request

GET /index.php HTTP/1.1

2.2. Server response

HTTP/1.1 301 Moved Permanently

3. Cachable

A 301 response is cacheable by default; i.e., unless otherwise indicated by the method definition or explicit cache controls.

Refer to these cache headers for more information.

4. Response Handling

  • If a client has link-editing capabilities, it should update all references to the requested URL with the new URL.
  • Search engines (Google and Bing) replace the old URL in the search results, and the old URL will eventually disappear. Link juice will pass from the old URL to the new URL.
  • The browsers will automatically detect the 301 response code after that it will read the new location URL and redirect the request to that new location.

Reference : RFC 7231


  1. The browsers will automatically detect the most of the 3xx code class which makes it not very suitable for API in cause your clients are java script based Rich clients. This response will not reach the JavaScript code.

    So at least you should only use it how it meant in HTTP. Clear redirection on GET or HEAD and no custom semantics.


Leave a Comment