代码之家  ›  专栏  ›  技术社区  ›  Inigo

barryvdh/laravel cors配置不在laravel 5.6中工作;忽略“允许的方法”

  •  1
  • Inigo  · 技术社区  · 7 年前

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

    我已禁用了中api路由的CSRF检查 VerifyCsrfToken.php 具有

    protected $except = [
        'api'
    ];
    

    我将配置文件设置如下:

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

    ...我做了个测试 POST 在邮递员中使用“来源: https://developer.mozilla.org “在标题中。

    https://developer.mozilla.org 它抛出了“CORS政策中不允许的”错误这就是我所期望的,根据配置-好的。

    但是如果我把配置行改成

    'allowedMethods' => ['GET']
    

    (即只允许GET请求),并运行 相同的 在邮递员中发布请求。。。它仍然有效。

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

    0 回复  |  直到 7 年前
        1
  •  2
  •   sideshowbarker Miguel Tomás    5 年前

    在CORS协议中,服务器本身从不执行任何阻塞,而是由浏览器执行,并且仅由浏览器执行,并且仅适用于在浏览器中运行前端JavaScript代码的情况(而不是,例如,当使用邮递员或其他东西发送请求时)。

    所以设置的唯一效果 allowedMethods 是让服务器发送 Access-Control-Allow-Methods

    浏览器仅在响应CORS预飞行时才检查该标题的值 OPTIONS 访问控制允许方法 选项 响应不包含与代码尝试使用的方法匹配的内容,飞行前失败。

    但是,如果前端代码请求不是触发预飞行的请求,浏览器会直接发送它,即使设置了 允许的方法 不包括代码使用的请求方法名称。

    换句话说, 访问控制允许方法 如果您有 POST 邮递 没有触发飞行前的特征。因此,浏览器从不咨询用户 访问控制允许方法 在这种情况下,headers值为。

    https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Preflighted_requests 列出将触发CORS飞行前的特征,但在 邮递 GET 请求,它基本上相当于您的代码是否向请求添加任何自定义头。