我对我的 API 服务器(NodeJS Express)只允许 GET 方法感到困惑
res.setHeader('Access-Control-Allow-Methods', 'GET');
然后我发出带有 header 的 CORS POST 请求
headers: {
'Content-Type': 'application/json',
'X-Test-Header': 'TESTING'
}
(目的是强制浏览器在 POST 请求之前调用 OPTIONS 请求)。然后我检查 Chrome 调试中的网络选项卡,它确实发送了 2 个请求(首先是 OPTIONS,然后是 POST 请求)。 OPTIONS请求的响应头为:
Access-Control-Allow-Methods: GET
问题是为什么当POST动词未包含在Allow-Methods header 中时它仍然调用POST请求?
谁知道这个请给我解释一下。提前致谢。
P/S:使用DELETE或PUT方法,会抛出错误
has been blocked by CORS policy: Method PUT is not allowed
by Access-Control-Allow-Methods in preflight response.
我认为使用 POST 方法它必须抛出相同的错误来指示该方法不允许
P/S:我仍然面临这个问题,有谁知道并向我解释一下,先谢谢了
最佳答案
我最近也遇到了同样的问题。我在fetch spec中找到了这个,我认为它可以用作真正的 http 规范的引用,因为 fetch API 必须遵守它。根据步骤7,如果CORS check返回成功,则会执行步骤7.5,推断请求的方法是否有效。我们可以注意到,如果请求的方法不在Access-Control-Allow-Methods中,并且它不是CORS安全列表方法(GET ,POST,HEAD),它会抛出错误。
从上面的推论,我们可以知道这是因为您的预检通过了CORS检查,即使请求的方法与Access-Control-Allow-Methods不匹配 strong>,由于它是一个CORS安全列表方法,因此不会抛出错误。
考虑到,如果您想禁止 POST 方法,则不应让它通过 CORS 检查。例如,请勿在响应中设置 Access-Control-Allow-Origin。无论您设置什么 Access-Control-Allow-Methods 都不重要,因为它是一个 CORS 安全列表方法。
关于request - 预检请求不允许 POST 方法后,浏览器仍发送 HTTP POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54631433/