Http CORS飞行前请求的正确状态代码是什么?

Http CORS飞行前请求的正确状态代码是什么?,http,cors,http-status-codes,preflight,Http,Cors,Http Status Codes,Preflight,当一个编写良好的HTTP服务器收到CORS预飞行(OPTIONS)请求时,它应该返回什么状态代码 200,204还是别的什么 如果允许使用源代码(并设置相应的标题)或不允许使用源代码(且不设置CORS标题或与源代码不匹配),状态代码是否不同?其要点是,只需使用200 更一般一点:您应该为CORS飞行前OPTIONS请求发回与任何其他OPTIONS请求相同的状态代码。相关规范不要求或建议除此之外的任何内容 就相关规范而言:Fetch规范是定义CORS协议要求的地方,它表示状态可以是200-299范

当一个编写良好的HTTP服务器收到CORS预飞行(
OPTIONS
)请求时,它应该返回什么状态代码

200
204
还是别的什么


如果允许使用源代码(并设置相应的标题)或不允许使用源代码(且不设置CORS标题或与源代码不匹配),状态代码是否不同?

其要点是,只需使用
200

更一般一点:您应该为CORS飞行前
OPTIONS
请求发回与任何其他
OPTIONS
请求相同的状态代码。相关规范不要求或建议除此之外的任何内容

就相关规范而言:Fetch规范是定义CORS协议要求的地方,它表示状态可以是
200
-
299
范围内的任何内容

这是来自,它有:

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

至于“正常状态”是什么,规范中说:

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;
正常状态是
200
299
范围内的任何状态

除此之外,Fetch规范不建议在
200
-
299
中使用任何特定状态

这里的另一个相关规范是HTTP1.1规范,其中有一节定义了所有HTTP响应状态代码的语义,以及其中的代码

在这一部分中有这样一句话:

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飞行前选项的响应只需要:

  • 请求已成功的指示
  • 通信选项的表示(在本例中包括和响应头)
这就是HTTP规范所定义的,所以您可以到此为止

但是,如果通读一遍,您可以确认它们的语义对于
选项
响应没有任何意义,除了

现在,就
204无内容
而言,将其用于
选项
响应没有任何问题,但就我所见,也没有任何意义。那是因为:

  • 与其他一些方法不同,HTTP规范定义了不使用
    OPTIONS
    有效负载
  • 因此,在实践中,客户端不希望任何负载(内容)返回到
    选项中(并且不会对任何返回的负载执行任何操作)
…据我所知,在
OPTIONS
响应中使用特定的
204
状态代码来明确告诉客户端没有有效负载没有实际意义

不过,我可能错了,我遗漏了一些细微差别。但我不这么认为

在允许或不允许来源(将设置相应的标题)的情况下,状态代码是否不同(将不设置CORS标题或与来源不匹配)

不,我认为不应该有什么不同。我不知道除了
200
204
之外,您还可以使用什么标准定义的代码,但不管怎样,规范不要求它有任何不同,如果有,也不定义任何不同的用途。试想一下:由于这两种情况下的状态代码不同,现有的客户机代码会有什么不同

如果这个问题的答案是“没什么”,就我所知,没有必要改变它



综上所述,底线是:只需发送
200OK
即可获得CORS飞行前
选项
响应。只发送
200 OK
以外的任何代码都是没有必要的,也没有用的。

我使用了
204
。现在它不再跨浏览器工作了。使用
200
。如果飞行前收到
204
,Firefox开始拒绝CORS请求。调试它花了我将近2个小时


要吸取的教训:当对web标准有疑问时,不要选择有意义的规范(即无内容的
204
)。选择大多数人做的事情(简单/愚蠢的选择)

204无内容的
在这里似乎合适。为什么不使用它呢?@blz在他们的回答中,Mihai说Firefox拒绝204个飞行前响应。我对Firefox不太清楚,但举个例子说:“一些传统浏览器(IE11,各种智能电视)在204上阻塞了”。我刚刚浪费了一个上午的时间,调试了我用上面的答案编写的代码,建议使用204。我想知道这一挑剔的更改浪费了多少开发人员的时间。