Access-Control-Allow-Methods的默认值

问题描述 投票:22回答:2

我刚刚了解了Access-Control-Allow-Methods标题,例如

Access-Control-Allow-Methods: OPTIONS, HEAD, GET

我从来没有使用过这个标题(只是Access-Control-Allow-Origin),但过去我已经让CORS工作了。

是默认允许所有方法,还是我对未定义的行为感到幸运?

http header cross-domain cors
2个回答
21
投票

为了澄清,Access-Control-Request-Method是一个请求标头,由浏览器在CORS预检请求中设置,它只能有一个值。 Access-Control-Allow-Methods头是一个CORS响应头,它可以有多个值。我假设你问的是Access-Control-Allow-Methods,因为这是服务器指定的值。

Access-Control-Allow-Methods标头指示特定端点上允许哪些HTTP方法用于跨源请求。如果您允许所有HTTP方法,那么可以将值设置为Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD。但是,如果要将端点限制为仅限几种方法,则应仅包括这些方法。

至于为什么你之前没有看到这个,这个标题只用于CORS预检请求。可能是您的应用程序没有使用CORS预检,然后更改某些内容以触发预检。您的应用程序是否使用除GET / POST以外的任何HTTP方法或任何自定义HTTP标头?

您可以在此处了解有关CORS预检请求的更多信息:http://www.html5rocks.com/en/tutorials/cors/


6
投票

Access-Control-Allow-Methods的默认值是允许通过所有简单方法,甚至是在预检请求上。正如https://www.w3.org/TR/cors/#preflight-request上的流程所说(成功预检请求的第7步):

如果请求方法不是方法中任何方法的区分大小写匹配,并且不是一个简单的方法,请应用缓存和网络错误步骤。

而简单方法的定义是:

如果方法与以下之一区分大小写匹配,则称该方法是一种简单方法:GET HEAD POST

因此,如果您有一个预检POST请求(由于自定义HTTP标头,比如说),并且不发送Access-Control-Allow-Methods响应标头,请求仍然可以继续。

© www.soinside.com 2019 - 2024. All rights reserved.