HTTP OPTIONS 请求可以返回 204 还是应该始终返回 200?

Posted

技术标签:

【中文标题】HTTP OPTIONS 请求可以返回 204 还是应该始终返回 200?【英文标题】:Can an HTTP OPTIONS request return a 204 or should it always return 200? 【发布时间】:2013-01-20 02:38:34 【问题描述】:

根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.2,唯一提到的关于 HTTP OPTIONS 请求的响应是 200。但是,似乎在某些情况下,例如内容长度为 0 时,204 会更合适。 HTTP OPTIONS 请求返回 204 是否合适?

【问题讨论】:

至于响应 CORS 预检 OPTIONS 请求的正确状态代码是什么,请参阅***.com/questions/46026409/… 的答案。它的要点是,您可以根据需要返回 204,但对于 CORS 协议,浏览器并不关心它是 200、204 还是其他一些 2xx 响应——200 到 299 范围内的任何响应都是就浏览器处理 CORS 协议而言,其处理方式完全相同。 【参考方案1】:

RFC 2616 说:

200 响应应该...

...

如果没有包含响应正文,则响应必须包含 字段值为“0”的 Content-Length 字段。

这确实让人不清楚 200 是适用于整个段落还是仅适用于第一句。如果您想安全起见,您可以让 MUST 优先(而且不会花费太多)。

RFC 7231 取代了 RFC 2616,将措辞改为

生成对 OPTIONS 的成功响应的服务器应该...

...

如果响应中不发送任何有效负载正文,服务器必须生成值为“0”的 Content-Length 字段。

这使得最后一句话在一般意义上适用于 2xx 状态,并且 MUST 占上风。

因此,必须发送 Content-Length。但是不能使用 204 发送 Content-Length:

RFC 2616 是这样说的:

请求中存在消息体通过包含 Content-Length 或 Transfer-Encoding 标头字段来表示...

... 所有 1xx(信息性)、204(无内容)和 304(未修改)响应均不得包含消息正文。

RFC 7230 也阐明了这一点:

服务器不得在任何状态码为 1xx(信息)或 204(无内容)的响应中发送 Content-Length 标头字段。

反正我是这么理解的。

【讨论】:

OPTIONS 应始终返回 2xx 代码,否则 1. 响应中没有 Content-Length 2. 您的预检请求失败并且您无法(例如)将新文件放入 webdav 不幸的是,nginx 和lighttpd 今天出错了,我很想找到一个好的替代品。【参考方案2】:

是的,它可以返回 204. 或 400. 或 404. 对于方法可以返回哪些状态码没有一般限制。

还请注意,是时候停止查看 RFC 2616。请参阅 http://trac.tools.ietf.org/wg/httpbis/trac/wiki。

【讨论】:

大概第二个“或 400”应该是“或 404”(或其他非 400)。 您如何看待这里的其他答案?虽然在实践中浏览器似乎是“OK”的 204 FWIW ......事实上的标准,为了胜利! :) @rogerdpack 我也有同样的想法,但是由于 Firefox 对缺少 Content-Length 标头非常严格,我们不得不在应用程序中将 204 更改为 200,所以这不是真的今天,“实际上浏览器在 204 上是“OK”的”!所以 amichair 的另一个答案是正确的,而这个是不正确的。 @rogerdpack - fwiw,答案并不正确,只是因为某些浏览器没有正确实现 HTTP。如果您认为自己发现了浏览器错误,您应该开一张票。【参考方案3】:

在现有语言内,唯一解决RFC 7230 §3.3.2 Content-Length之间明显矛盾的方法:

“服务器不得在任何状态码为 1xx(信息)或 204(无内容)的响应中发送 Content-Length 标头字段。”

和RFC 7231 §4.3.7 OPTIONS:

“如果没有在响应中发送有效负载正文,服务器必须生成一个值为“0”的Content-Length 字段。”

是禁止对OPTIONS 请求的所有 204 响应。因为这似乎不是本意,所以我提交了erratum report。后一个语句是来自 RFC 7231 的 draft-ietf-httpbis-semantics-06 中的 removed,因此现在明确允许 204 响应(没有 Content-Length 字段)。

【讨论】:

以上是关于HTTP OPTIONS 请求可以返回 204 还是应该始终返回 200?的主要内容,如果未能解决你的问题,请参考以下文章

http状态码204/206/200理解

MSIE 为 Ajax 请求返回状态码 1223

上传文件时杜松子酒不断返回204

使用 fetch() 的 POST 请求返回 204 无内容

http跨域时的options请求

更新和删除的 HTTP 状态码?