CORS 预检请求的适当状态码是什么?

50

当HTTP服务器接收到CORS预检请求(OPTIONS)时,一个好的HTTP服务器应该返回哪个状态码?

200204 或其他什么状态码?

如果允许来源(并设置相应的标头),或者不允许(CORS标头将未设置或与来源不匹配),状态码是否应不同?

3个回答

55
要点是,只需使用200
更一般地说:对于CORS预检OPTIONS请求,应该发送与其他OPTIONS请求相同的状态码。相关规范不需要或建议更多的操作。
规范内容:CORS协议要求在https://fetch.spec.whatwg.org/中定义,在这里,状态可以是200-299范围内的任何值。
这来自于CORS-preflight fetch algorithm,其中a step saying it can be any “ok status"

如果请求和响应的CORS检查返回成功,并且响应的状态为ok status,则运行以下子步骤:…

至于“ok status”的含义,规范如下:

ok status是指范围在200299之间的任何状态。

除此之外,Fetch规范并不推荐在200-299范围内选择任何特定状态码。
另一个相关的规范是HTTP 1.1规范,其中有一节定义了所有HTTP响应状态码的语义,包括定义成功的2xx代码的部分
在该部分中,有一个特定的200 OK的部分,它指出:
The 200 (OK) status code indicates that the request has succeeded.
The payload sent in a 200 response depends on the request method.
For the methods defined by this specification, the intended meaning
of the payload can be summarized as:
…
OPTIONS  a representation of the communications options;

因此,对于CORS预检请求OPTIONS的响应只需要:

这就是HTTP规范中定义的200 OK,所以你可以在这里停止。

但是如果你阅读该部分其余的2xx代码, 你会确认它们的语义对于一个OPTIONS响应来说都没有意义,除了204 No Content

现在就204 No Content而言,使用它作为OPTIONS响应并没有什么问题——但也没有任何意义。那是因为:

  • 与其他一些方法不同,HTTP规范未定义OPTIONS有效载荷的使用方式
  • 因此,在实践中,客户端不期望收到任何OPTIONS有效载荷(内容)返回(并且不会对任何返回的有效载荷采取任何操作)

...因此,在OPTIONS响应中使用特定的204状态码明确告诉客户端没有有效载荷是没有实际目的的。

如果允许来源(并设置相应标头)或不允许(CORS标头将不会设置或不匹配来源),状态码是否应该不同?

不需要。无论如何,除了200204之外,您都不能使用任何标准定义的代码-但是无论如何,规范不要求其有任何不同,并且如果它是,则不定义任何不同的用途。而且想想看:由于这两种情况下状态码的任何差异,任何现有的客户端代码会有什么不同的操作?

如果答案是“没有”,那么没有必要使它变得不同。


鉴于上述情况,底线是:对于CORS预检请求的OPTIONS响应,仅发送200 OK即可。发送除200 OK以外的任何代码都是不必要且无用的。

12
在这里使用“204 NO CONTENT”似乎是合适的。为什么不使用它呢? - Louis Thibault
1
@blz 在他们的回答中,Mihai说Firefox会拒绝204个预检响应。我不确定Firefox,但例如此页面说:“一些旧版浏览器(IE11、各种智能电视)会在204上出现问题”。 - Lukas Kalbertodt

17
我用了204。现在它在跨浏览器中不再起作用了。请使用200。如果预检接收到204,Firefox将开始拒绝CORS请求。这浪费了我近2个小时的调试时间。
教训:当对Web标准存在疑虑时,请不要选择看起来合理的规范(例如没有内容的204)......而是选择大多数人都在使用的方法(即简单/愚蠢的选择)。

1
我刚刚因为这个问题浪费了一个上午的时间,调试我之前使用上面推荐204的答案编写的代码。我想知道有多少开发人员因为这个琐碎的更改而浪费了时间。 - tekHedd
@Mihai,你有关于为什么 OPTIONS 中的 204 会影响 GET 请求的上下文吗?这似乎是一些浏览器/操作系统/设备组合的问题。 - Șerban Ghiță

-1

我正在使用基本身份验证通过 AJAX 调用传递的标头,Firefox 和 Chrome 都在使用 204 进行预检/选项。

FireFox Network panel

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接