301 Moved Permanently
This is an educational reference page about HTTP 301 Moved Permanently. The page itself is served as 200 OK so it can be indexed as HTTP documentation.
The target resource has been assigned a new permanent URI. The server sends that URI in the Location header, and clients should use it for future requests.
What it means
HTTP 301 Moved Permanently is a permanent redirect. The Location header gives the replacement URL for future requests, bookmarks, and crawlers.
Common causes
- A page, asset, API route, or full domain was replaced by a new permanent URL.
- The site canonicalizes protocol or host, such as http to https or www to non-www.
- Routing rules normalize slashes, casing, or old URL slugs.
- Duplicate pages are consolidated so search engines index one canonical address.
How to fix it
- Send one 301 response with Location set to the final URL, not to another redirect.
- Change internal links, canonical tags, hreflang links, and sitemap entries to the destination URL.
- Keep redirects that still receive backlinks, bookmarks, or crawler requests.
- Use 302 or 307 for temporary moves; use 308 when a permanent redirect must keep the original method and request body.
Example response
HTTP/1.1 301 Moved Permanently
Location: https://example.com/new-url
Cache-Control: public, max-age=3600
Developer notes
301 is the normal status code for permanent site moves and HTTP-to-HTTPS migrations. Many clients cache it, and older clients may retry a redirected POST as GET. For APIs or forms where the method must not change, prefer 308.
Questions
What does HTTP 301 mean?
HTTP 301 means the resource moved permanently. Read the Location header for the new URL.
Should a 301 redirect be used for SEO?
Use 301 for a permanent move. Then update internal links and sitemaps so crawlers reach the final URL without an extra hop.
How long should a 301 redirect stay live?
Keep it while old URLs still have backlinks, bookmarks, traffic, or crawler hits.
What is the difference between 301 and 308?
Both are permanent redirects. 308 preserves the request method and body; 301 has older client behavior where non-GET requests may become GET.