barryvdh/laravel cors配置不在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

我已经在我的Laravel 5.6应用程序中安装了该软件包,并在
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代码的跨源请求,而是在测试……其他东西。