Access-Control-Allow-Methods的默认值

时间:2013-12-09 18:50:08

标签: http header cross-domain cors

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

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

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

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

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:6)

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

  

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

简单方法的定义是:

  

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

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