410 Gone
用法
收到 410 Gone 错误消息时,客户端知道该地址一度有效,但资源已不复存在。这是在某个资源(例如作为限时优惠一部分提供的文档)过期后返回的响应。如果服务器预期该移除并非永久,则改用 404。
此状态码有助于网站维护,并向客户端发出信号以移除指向该资源的链接。该响应默认可缓存。客户端和中间节点在没有显式 Cache-Control 指令的情况下也会存储 410。行为良好的客户端不会重试该请求,这与 404 不同——404 之后重试可能会成功。
常见使用场景包括已过期的促销、已弃用的 API 端点,以及被永久移除的归档内容。
SEO 影响
像 Google 这样的搜索引擎不会索引响应状态为 410 的 URL。此前已被索引的 URL 会从搜索结果中移除。返回此状态码的页面不会消耗抓取预算。Google 对 404 和 410 的处理完全相同。二者都会以相同的速率将内容从索引中移除。返回带错误内容的 200,或将已删除的 URL 重定向到首页而非返回 410,会造成软 404,这会浪费抓取预算并削弱对站点服务器信号的信任。
示例
客户端请求某个资源,由于促销已结束、内容不再可用,服务器返回 410 Gone。
请求
GET /holiday-promotion-Jan-2021.pdf HTTP/1.1
Host: example.com
响应
HTTP/1.1 410 Gone
Content-Type: text/html
Content-Length: 133
<html>
<head>
<title>Promotion Expired</title>
</head>
<body>
<p>The promotional period has ended.</p>
</body>
</html>
如何修复
当意外出现 410 时,检查服务器配置文件中是否有无意添加的规则。在 Apache 中,在 httpd.conf 和 .htaccess 中搜索带 [G](Gone)标志的 RewriteRule 条目或 Redirect gone 指令。在 nginx 中,查找服务器配置中 location 块内的 return 410。CMS 插件和近期升级有时会在毫无提示的情况下添加 410 规则。禁用近期安装的插件以隔离来源。
如果移除是有意的,更新 sitemap 以排除该 URL,并移除指向该资源的内部链接。
在 WordPress 中,Redirection 或 Yoast SEO 等插件可通过管理界面管理 410 响应,而无需直接编辑服务器文件。
如果移除是无意的,恢复该资源或其替代内容并返回 200。当替代页面位于另一个 URL 时,301 重定向比 410 更合适。
代码参考
.NET
HttpStatusCode.Gone
Rust
http::StatusCode::GONE
Rails
:gone
Go
http.StatusGone
Symfony
Response::HTTP_GONE
Python3.5+
http.HTTPStatus.GONE
Java
java.net.HttpURLConnection.HTTP_GONE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_GONE
Angular
@angular/common/http/HttpStatusCode.Gone