barryvdh/laravel cors配置不在laravel 5.6中工作;忽略';允许的方法';
我已经在我的Laravel 5.6应用程序中安装了该软件包,并在barryvdh/laravel cors配置不在laravel 5.6中工作;忽略';允许的方法';,laravel,cors,Laravel,Cors,我已经在我的Laravel 5.6应用程序中安装了该软件包,并在app\Http\Kernel.php中将相关行添加到我的中间软件组中,并按照说明发布了配置文件 我已在VerifyCsrfToken.php中禁用了对api路由的CSRF检查 protected $except = [ 'api' ]; 我已将配置文件设置如下: 'supportsCredentials' => false, 'allowedOrigins' => ['https://developer.mo
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:”运行了一个测试POST
请求
很好。如果我将原始密钥更改为除“CORS策略中不允许”之外的任何其他值,则会抛出错误。这就是我所期望的,根据配置-罚款
但是如果我将配置行更改为
'allowedMethods' => ['GET']
(即只允许GET请求),并在Postman中运行相同的POST请求。。。它仍然有效
为什么??为什么它不尊重配置中对allowedMethods施加的限制?在CORS协议中,服务器本身从不进行任何阻塞-相反,阻塞是由浏览器完成的,并且仅由浏览器完成,并且仅适用于在浏览器中运行前端JavaScript代码的情况(而不是,例如,当使用邮递员或其他东西发送请求时) 因此,设置
allowedMethods
的唯一效果是使服务器发送带有特定值的Access Control Allow Methods
头。否则,服务器本身不会执行阻塞
浏览器仅在响应CORS飞行前OPTIONS
请求时才检查该标头的值。因此,只有在这种情况下,如果OPTIONS
响应中Access Control Allow Methods
的值与代码尝试使用的方法不匹配,则飞行前会失败
但是,如果前端代码的请求不是触发预飞行的请求,浏览器会直接发送请求,即使allowedMethods
的值设置不包括代码使用的请求方法名称
换句话说,Access Control Allow Methods
不会在前端代码中有POST
请求的情况下发送或接收,但是POST
没有触发预飞行的特征。因此,在这种情况下,浏览器不会参考Access Control Allow Methods
标题的值
列出将触发CORS预飞行的特征,但在
POST
或GET
请求的情况下,基本上相当于您的代码是否向请求添加任何自定义标题。Postman不是浏览器。跨源限制仅由浏览器强制执行。因此对于Postman来说,是否添加自定义标题无关紧要不是服务器启用了CORS。请参阅上的答案,我认为这并不能回答问题。这与请求是来自邮递员还是浏览器无关;我认为这是barryvdh/laravel CORS的包的问题。您写道,“在邮递员中运行相同的POST请求……它仍然有效”;重点是,无论您对laravel cors配置做了什么更改,您始终可以通过Postman向该API发出任何请求。通过Postman请求,您的laravel cors配置对您可以使用该API执行的操作没有任何影响。具体而言,Postman永远不会尊重laravel cors施加的任何限制allowedMethods的配置(或AllowedHeader,或在laravel cors配置中设置的任何其他内容).哦,我明白你的意思了。是的,但我可以在Postman标头中添加一个Origin
参数来模拟我的应用程序-这就是我正在做的-然后它确实尊重AllowedHeader。在任何情况下,提及Postman可能是一种转移注意力的手段-我的应用程序的ajax请求仍然会出现完全相同的问题。我的问题仍然存在。请注意,这个问题也被提出了。到目前为止,还没有提供答案……是的,barryvdh回答说:“你在跨域测试吗?它不会阻止任何东西,只有浏览器在跨域时阻止它,并且头不在那里。”.laravel cors从不在服务器端进行任何阻止。阻止仅在客户端通过浏览器进行。并且您不能在由浏览器中运行的前端JS代码发出的请求中更改源代码头的值。因此,如果您说“将源代码键更改为任何内容”然后,您实际上不是在测试来自前端JS代码的跨源请求,而是在测试……其他东西。