HTTPQUERY
English

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