Access-Control-Allow-Methods的默认值

Pau*_*per 26 header http cross-domain cors

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

Access-Control-Allow-Methods: OPTIONS, HEAD, GET
Run Code Online (Sandbox Code Playgroud)

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

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

mon*_*sur 26

简而言之,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/


M S*_*lle 7

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

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

而简单方法的定义是:

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

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

  • 在这里为读者稍微明确一点,PATCH、DELETE 和 PUT 不被认为是简单的方法。有趣的是,我发现浏览器的处理方式不一致。当省略 `Access-Control-Allow-Methods` 标头时,Chrome 选择允许这些方法,而 Firefox *不会*。 (2认同)