Http CORS飞行前请求的正确状态代码是什么?
当一个编写良好的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范
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飞行前选项的响应只需要:
- 请求已成功的指示
- 通信选项的表示(在本例中包括和响应头)
选项
响应没有任何意义,除了
现在,就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。我想知道这一挑剔的更改浪费了多少开发人员的时间。