barryvdh / laravel-cors配置在Laravel 5.6中不起作用;忽略“ allowedMethods”

时间:2018-07-19 11:52:15

标签: laravel cors

我已经在Laravel 5.6应用程序中安装了barryvdh/laravel-cors软件包,并在app\Http\Kernel.php的中间件组中添加了相关行,并按照说明发布了配置文件。

我已通过{p>在VerifyCsrfToken.php中禁用了对我的api路由的CSRF检查

protected $except = [
    'api'
];

我将配置文件设置如下:

'supportsCredentials' => false,
'allowedOrigins' => ['https://developer.mozilla.org'],
'allowedHeaders' => ['Content-Type', 'X-Requested-With'],
'allowedMethods' => ['GET', 'POST', 'PUT',  'DELETE']
'exposedHeaders' => [],
'maxAge' => 0,

...并且我已经在Postman中使用标题中的“来源:https://developer.mozilla.org”运行了一个测试POST请求。

工作正常。而且,如果我将Origin密钥更改为https://developer.mozilla.org以外的任何其他字符,它将引发“ CORS策略中不允许”。错误。根据配置,这是我期望的。

但是,如果我将配置行更改为

'allowedMethods' => ['GET']

(即,仅允许GET请求),然后在Postman中运行 same POST请求...仍然有效。

为什么?为什么它不遵守配置中对allowedMethods施加的限制?

1 个答案:

答案 0 :(得分:1)

重要的是要知道,在CORS协议中,服务器本身永远不会进行任何阻止-而是由浏览器(仅由浏览器)以及仅针对在浏览器中运行的前端JavaScript代码进行的阻止(而不是,例如,使用Postman或其他方式发送请求时。

因此,设置allowedMethods的唯一作用是使服务器发送具有特定值的Access-Control-Allow-Methods头。否则不会导致服务器本身阻塞。

浏览器仅在响应CORS预检OPTIONS请求时才检查该标题的值。因此只有在这种情况下,如果Access-Control-Allow-Methods响应中的OPTIONS的值不包含代码尝试使用的方法的匹配项,则预检将失败。

但是,如果您的前端代码请求不是触发预检的请求,则浏览器会直接发送该请求,即使allowedMethods设置的值不包括您的代码使用的请求方法名称。

换句话说,如果您在前端代码中有一个Access-Control-Allow-Methods请求,但POST不具有触发预检的特征,则不会发送或接收POST 。因此,在这种情况下,浏览器永远不会查询Access-Control-Allow-Methods标头的值。

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Preflighted_requests列出了将触发CORS预检的特征,但是对于POSTGET请求,它基本上等于您的代码是否将任何自定义标头添加到了请求。