301 Moved Permanently
用法
收到 301 Moved Permanently 状态码时,客户端应当将已存储的链接更新为新的 URI。新的 URI 由 Location 头指定,客户端据此进行自动重定向。
当服务器迁移到新域名,或在没有计划恢复到旧 URI 的情况下重新组织其内部文件结构时,通常会返回此响应。
方法变更
出于历史原因,用户代理在收到 301 重定向时被允许将 POST 改为 GET。大多数浏览器正是这样做的,使得这种方法变更成为事实上的标准行为。308 状态码正是为了在无歧义的前提下保证方法不变而创建的。对于 API 和现代应用,当必须保留原始方法时,永久重定向应优先使用 308。
301 重定向至少应保持一年有效,最好永久保留。Google 能够很快识别 301,但完整的信号转移需要数周时间。浏览器会根据 Cache-Control 指令对 301 响应进行激进缓存。若没有显式的缓存头,该重定向会无限期地保留在浏览器缓存中。在服务端移除 301 并不会清除浏览器中已缓存的重定向。
注意
当旧 URL 必须永久停止提供内容时,使用 301。当两个 URL 都继续提供内容、但其中一个更适合被索引时,使用 rel=“canonical”。301 会强制所有流量转向新 URL,而 canonical 只是一个提示,搜索引擎会遵循但不会强制执行。
SEO 影响
Google 将 301 视为重定向目标即为首选 URL 的强信号。排名信号会从旧 URL 转移到新 URL。将 301 用于永久 URL 变更、域名迁移和 HTTPS 升级。Google 最多跟随 10 跳重定向。中间重定向 URL 的内容会被忽略。用 301 将已删除的 URL 重定向到首页或通用分类页,会被 Google 判定为软 404。
示例
客户端请求一个 HTML 资源。服务器返回 301 Moved Permanently,并在 Location 头中包含新的 URI。消息体建议用户更新书签,不过现代浏览器会立即重定向。
请求
GET /news.html HTTP/1.1
Host: example.com
响应
HTTP/1.1 301 Moved Permanently
Location: http://example.com/feeds/news.html
Content-Type: text/html; charset=UTF-8
Content-Length: 150
<h1>The Newsfeed has moved</h1>
<body>
The newsfeed has moved permanently to
<a href=/feeds/news.html>here</a>.
Please update your bookmarks.
</body>
代码参考
.NET
HttpStatusCode.MovedPermanently
Rust
http::StatusCode::MOVED_PERMANENTLY
Rails
:moved_permanently
Go
http.StatusMovedPermanently
Symfony
Response::HTTP_MOVED_PERMANENTLY
Python3.5+
http.HTTPStatus.MOVED_PERMANENTLY
Java
java.net.HttpURLConnection.HTTP_MOVED_PERM
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_MOVED_PERMANENTLY
Angular
@angular/common/http/HttpStatusCode.MovedPermanently