我刚刚了解了Access-Control-Allow-Methods
标题,例如
Access-Control-Allow-Methods: OPTIONS, HEAD, GET
我从来没有使用过这个标题(只是Access-Control-Allow-Origin
),但过去我已经让CORS工作了。
是默认允许所有方法,还是我对未定义的行为感到幸运?
为了澄清,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/
Access-Control-Allow-Methods
的默认值是允许通过所有简单方法,甚至是在预检请求上。正如https://www.w3.org/TR/cors/#preflight-request上的流程所说(成功预检请求的第7步):
如果请求方法不是方法中任何方法的区分大小写匹配,并且不是一个简单的方法,请应用缓存和网络错误步骤。
而简单方法的定义是:
如果方法与以下之一区分大小写匹配,则称该方法是一种简单方法:GET HEAD POST
因此,如果您有一个预检POST请求(由于自定义HTTP标头,比如说),并且不发送Access-Control-Allow-Methods
响应标头,请求仍然可以继续。