HTTP 500表示服务器因意外原因无法满足请求。当服务器因已知或预期而无法满足请求时,使用的最佳HTTP响应代码是什么?
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
通过HTTP查看一些文档,我找不到一个好的答案,这似乎是一个重要的区别。为一个并不真正代表“内部服务器错误”的错误抛出500可能不是一个好习惯。答案 0 :(得分:33)
现在,RFC 2616不再具有相关性,使用此类文档作为参考的任何人都应该立即停止。引用Mark Nottingham,在撰写本文时,他们共同主持IETF HTTP和QUIC工作组:
请勿使用RFC2616 。将其从硬盘驱动器,书签中删除,然后刻录(或负责任地回收)打印出来的任何副本。
旧的RFC 2616已被以下文档取代,这些文档共同定义了HTTP / 1.1协议:
如果您正在寻找状态代码定义,那么RFC 7231就是您应该参考的文档。
根据已知或预期的原因,您可以返回正确的状态代码:
404
。403
。401
。501
。409
。301
状态代码是正确的选择。有关详细信息,请查看RFC 7231,并查看decision chart放在一起的以下Michael Kropat:
状态代码分为三大类:
从这里开始:
2xx
和3xx
状态代码
4xx
状态代码
5xx
状态代码
答案 1 :(得分:1)
答案在于其他http代码的定义语义。例如,对于受保护的页面,身份验证失败是预期的错误,因此401是适当的响应。 人们甚至可以争辩说,401是一种法律回应,甚至不是错误代码,四种情况。 并且这种区别可能是语义原因,即判断预期的错误代码实际上是错误还是仅仅是请求的合法结果可能是模棱两可的。
答案 2 :(得分:1)
在许多情况下,返回200并具有自定义域特定状态/错误代码/原因可能更好。
就像你说的那样,返回500通常表示服务器无法完成执行请求。我想查看500基本上等同于服务器崩溃或抛出异常,我会避免将其抛出任何可以预测和优雅处理的错误。
如果您正在寻找的东西更像是"服务器确实可以评估该请求,但发现用户要求的内容由于某种原因无法实现" (例如,某些资源已耗尽),那么您可能最好使用200 +自定义状态代码,除非原因与4xx范围内的某个特定代码相匹配(例如,403为"用户不拥有所需的特权")。