HTTP状态代码“无法满足*已知*原因的请求”

时间:2015-11-19 22:40:31

标签: http web server

HTTP 500表示服务器因意外原因无法满足请求。当服务器因已知预期而无法满足请求时,使用的最佳HTTP响应代码是什么?

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

通过HTTP查看一些文档,我找不到一个好的答案,这似乎是一个重要的区别。为一个并不真正代表“内部服务器错误”的错误抛出500可能不是一个好习惯。

3 个答案:

答案 0 :(得分:33)

不要再使用RCF 2616作为参考

现在,RFC 2616不再具有相关性,使用此类文档作为参考的任何人都应该立即停止。引用Mark Nottingham,在撰写本文时,他们共同主持IETF HTTP和QUIC工作组:

  

请勿使用RFC2616 。将其从硬盘驱动器,书签中删除,然后刻录(或负责任地回收)打印出来的任何副本。

旧的RFC 2616已被以下文档取代,这些文档共同定义了HTTP / 1.1协议:

如果您正在寻找状态代码定义,那么RFC 7231就是您应该参考的文档。

已知或预期的原因是什么

根据已知或预期的原因,您可以返回正确的状态代码:

  • 无法满足请求,因为客户端请求的资源不存在?返回404
  • 是授权问题吗?转到403
  • 使用HTTP authentication并且凭据无效?返回401
  • 服务器是否支持完成请求所需的功能?使用501
  • 由于与目标资源的当前状态发生冲突,请求无法完成吗?所以应该返回409
  • 是否为目标资源分配了新的永久URI? 301状态代码是正确的选择。
  • 依旧......

决策图

有关详细信息,请查看RFC 7231,并查看decision chart放在一起的以下Michael Kropat


状态代码分为三大类:

HTTP status codes categories


从这里开始:

HTTP status codes



选择2xx3xx状态代码


HTTP 2xx and 3xx status codes



选择4xx状态代码


HTTP 4xx status codes



选择5xx状态代码


HTTP 5xx status codes

答案 1 :(得分:1)

答案在于其他http代码的定义语义。例如,对于受保护的页面,身份验证失败是预期的错误,因此401是适当的响应。 人们甚至可以争辩说,401是一种法律回应,甚至不是错误代码,四种情况。 并且这种区别可能是语义原因,即判断预期的错误代码实际上是错误还是仅仅是请求的合法结果可能是模棱两可的。

答案 2 :(得分:1)

在许多情况下,返回200并具有自定义域特定状态/错误代码/原因可能更好。

就像你说的那样,返回500通常表示服务器无法完成执行请求。我想查看500基本上等同于服务器崩溃或抛出异常,我会避免将其抛出任何可以预测和优雅处理的错误。

如果您正在寻找的东西更像是"服务器确实可以评估该请求,但发现用户要求的内容由于某种原因无法实现" (例如,某些资源已耗尽),那么您可能最好使用200 +自定义状态代码,除非原因与4xx范围内的某个特定代码相匹配(例如,403为"用户不拥有所需的特权")。