HTTP 状态码 410 Gone 以及它是否值得使用

HTTP 状态码 410 Gone 以及它是否值得使用

Chris Yue No Comment
Posts

今天搬运狂人阮一峰了一篇关于异步 API 设计的文章。很佩服阮老师坚持不懈的搬运工作,比我这三天打渔两天晒网牛逼多了。

这篇文章里描述的设计,很好很经典,我认为的异步接口设计就是这样,这里不再多说,看原文就好。我这里主要聊一个对我来说是新鲜知识点的部分——HTTP Status Code 410 Gone

对于我这种往死里榨干 HTTP 协议的一切价值的人来说,以前居然从来没有重视过 410,实在有些惭愧。估计很多人跟我一样,410 感觉跟经典的 404 挺像的,但他们的区别到底是什么呢?

上面 MDN 提供的链接里已经提示我们:当某个链接不知道是暂时访问不了还是永久访问不了,就不应该使用 410,而是 404,并且还有一句提示:410 默认情况应该是可缓存的。

如果我们再看看 404 的解释,会发现里面也有一句跟 410 相关的一句话:如果链接是永久性的删除,那么应该使用 410。

另外我也不知道再哪里看到的,说 Google 对 404 和 410 的处理是不一样的,号称对 410 的处理更迅速(指对索引的删除处理)。

从上面的描述我们可以看出,410 比 404 多了一个更确定的意味在里面,即:它曾经存在,但确定被永久删除。如果某一篇博客文章,或者论坛帖子被管理员永久删除了,按 HTTP 协议,你应该返回 410,而不是 404。

但正因为 410 『确定』的这个意味,也暗示了 410 对服务器的一个要求:服务器必须要知道资源被永久删除这个事实。

在讨论异步接口设计的那篇文章里,提到了对异步任务删除之后,再次查询应返回 410 状态的设计,但进一步想想,那就意味着这些异步任务在服务器上不能被真的删除,因为一旦被真的删除,服务器就不知道该任务是否曾经存在,也就不知道该返回 404 还是 410。这就牵涉到成本的问题,因为存储数据肯定是需要成本的。

所以是否使用 410,我认为还是得结合实际情况,如果使用它带来的成本增加已经显著大于带来的收益,那么我认为真得好好考虑,把 410 用在队列任务查询上我认为就是一个典型的例子。而在不增加成本的地方使用 410,更加符合标准地使用 HTTP 协议,还是很有必要的。

HTTP 状态码 410 Gone 以及它是否值得使用 by Chris Yue is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

微信赞赏码

文章不错,我要帮站长分担建站费!
天使投赏人

发表评论

four + = 10