barryvdh/laravel-cors 配置在 Laravel 5.6 中不起作用;忽略'allowedMethods'
Posted
技术标签:
【中文标题】barryvdh/laravel-cors 配置在 Laravel 5.6 中不起作用;忽略\'allowedMethods\'【英文标题】:barryvdh/laravel-cors configs not working in Laravel 5.6; Ignores 'allowedMethods'barryvdh/laravel-cors 配置在 Laravel 5.6 中不起作用;忽略'allowedMethods' 【发布时间】:2018-12-27 13:17:34 【问题描述】:我已经在我的 Laravel 5.6 应用程序中安装了 barryvdh/laravel-cors 包,并将相关行添加到我在 app\Http\Kernel.php
中的中间件组中,并按照说明发布了配置文件。
我在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 中使用标题中的“Origin: https://developer.mozilla.org”运行了一个测试 POST
请求。
它工作正常。如果我将 Origin 密钥更改为 https://developer.mozilla.org 以外的任何内容,则会引发“CORS 策略中不允许”。错误。根据配置,这是我所期望的。
但是如果我将配置行更改为
'allowedMethods' => ['GET']
(即只允许 GET 请求),并在 Postman 中运行 same POST 请求......它仍然有效。
为什么?为什么它不尊重配置中对 allowedMethods 的限制?
【问题讨论】:
Postman 不是浏览器。跨域限制仅由浏览器强制执行。所以对于 Postman 来说,服务器是否启用了 CORS 并不重要。请参阅***.com/questions/43432743/… 和***.com/questions/45069689/… 的答案 我认为这不能回答问题。这与请求是来自邮递员还是浏览器无关;我认为这是barryvdh/laravel-cors
包的问题
您写道,“在 Postman 中运行相同的 POST 请求......它仍然有效”;关键是无论您对 laravel-cors 配置进行什么更改,您始终可以使用 Postman 向该 API 发出任何请求。您的 laravel-cors 配置对您可以通过 Postman 请求使用该 API 执行的操作的影响为零。具体来说,Postman 永远不会尊重 laravel-cors 配置对 allowedMethods 施加的任何限制(也不会考虑 allowedHeaders,也不会尊重您在 laravel-cors 配置中设置的任何其他内容)。
哦,我明白你的意思了。是的,但我可以在 Postman 标头中添加一个 Origin
参数来模拟我的应用程序 - 这就是我正在做的 - 然后它确实尊重 allowedHeaders。在任何情况下,在这里提到 Postman 可能是一个红鲱鱼 - 我的应用程序的 ajax 请求仍然存在完全相同的问题。我的问题仍然存在。请注意,here 和 here 也提出了此问题。迄今为止,尚未提供任何答案...
是的 barryvdh 回答:“你在跨域测试吗?它不会阻止任何东西,只有当它是跨域并且标题不存在时,浏览器才会阻止它。”。 laravel-cors 不会在服务器端发生任何阻塞。阻止仅在客户端由浏览器完成。并且您无法更改浏览器中运行的前端 JS 代码发出的请求中 Origin 标头的值。因此,如果您说 “将 Origin 密钥更改为任何内容”,那么您实际上并不是在测试来自前端 JS 代码的跨域请求,而是在测试……其他东西。
【参考方案1】:
在 CORS 协议中,服务器本身从不进行任何阻塞 - 而是由浏览器完成,并且仅由浏览器完成,并且仅适用于在浏览器中运行的前端 javascript 代码的情况(而不是,例如,在使用 Postman 时)或发送请求的东西)。
所以设置allowedMethods
的唯一效果是使服务器发送具有特定值的Access-Control-Allow-Methods
标头。否则它不会使服务器本身进行阻塞。
浏览器仅在响应 CORS 预检 OPTIONS
请求时检查该标头的值。因此,只有在这种情况下,如果 OPTIONS
响应中的 Access-Control-Allow-Methods
的值不包含与您的代码尝试使用的方法匹配的值,预检就会失败。
但是,如果您的前端代码的请求不是触发预检的请求,浏览器会直接发送它,即使为 allowedMethods
设置的值不包括您的代码使用的请求方法名称。
换句话说,如果您的前端代码中有POST
请求,但POST
没有触发预检的特征,则不会发送或接收Access-Control-Allow-Methods
。因此,在这种情况下,浏览器永远不会查询 Access-Control-Allow-Methods
标头的值。
【讨论】:
以上是关于barryvdh/laravel-cors 配置在 Laravel 5.6 中不起作用;忽略'allowedMethods'的主要内容,如果未能解决你的问题,请参考以下文章
barryvdh/laravel-cors 不适用于我的路线