我已经在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施加的限制?
答案 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预检的特征,但是对于POST
或GET
请求,它基本上等于您的代码是否将任何自定义标头添加到了请求。