使用Laravel-Cors

时间:2017-10-03 19:05:52

标签: laravel laravel-5 cors laravel-5.5

我以前使用自定义cors中间件来根据我的环境处理Allow Origin。但升级到5.5之后,我遇到了预检OPTIONS cors的问题,所以我切换到了laravel-cors库。但现在我不知道如何通过配置文件处理不同的情况。我想知道是否有人遇到过类似的问题。这是我之前的自定义cors中间件:

public function handle($request, Closure $next)
{

    $origin = \Config::get('app.url', "https://mysite.ca");

    // Set origin for localhost developing, else just use the staging server
    if( isset( $_SERVER['HTTP_ORIGIN'] ) && $_SERVER['HTTP_ORIGIN'] === 'http://app.localhost:3333' ) {
        $origin = 'http://app.localhost:3333';
    }


    $response = $next($request);


    $response->headers->set('Access-Control-Allow-Origin', $origin);
    $response->headers->set('Access-Control-Expose-Headers','Authorization');
    $response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
    $response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
    $response->headers->set('Access-Control-Allow-Credentials','true');

    return $response;
}

1 个答案:

答案 0 :(得分:1)

默认情况下,

laravel-cors自动执行与问题中自定义代码相同的操作 - 也就是说,laravel-cors根据Access-Control-Allow-Origin的值有条件地设置Origin值{1}}标题是,如果您已在配置中允许它。

但是,就问题中的代码所做的而言,不清楚为什么要发送Access-Control-Allow-Origin响应标头,并将其值设置为app.url值。

我的意思是,app.url的值是您安装laravel-cors的同一服务器的网址,对吧?也就是说,它是您希望允许来自特定来源的跨源请求的应用程序。 如果是这种情况,那么您不需要明确允许来自app.url的请求,因为这些请求不是跨源请求,因此它们已被允许,而您无需执行任何操作

另一点是app.url不是原点 - 而是一个URL,可能带有路径。但起源没有路径。因此,您实际上并不想将$origin的值设置为app.url,除非您确定app.url没有路径(甚至没有尾随斜杠)。

所有这一切,如果您真的想要在问题中获得自定义代码的确切行为,您可以将$origin变量设置为全局变量,然后像这样设置allowedOrigins数组:

return [
     /*
     |--------------------------------------------------------------------------
     | Laravel CORS
     |--------------------------------------------------------------------------
     |
     | allowedOrigins, allowedHeaders and allowedMethods can be set to array('*')
     | to accept any value.
     |
     */
    'supportsCredentials' => true,
    'allowedOrigins' => [$origin, 'http://app.localhost:3333'],
    'allowedHeaders' => ['Content-Type', 'Accept', 'Authorization', 'X-Requested-With', 'Application'],
    'allowedMethods' => ['POST', 'GET', 'OPTIONS', 'PUT', 'DELETE'],
    'exposedHeaders' => ['Authorization'],
    'maxAge' => 0,
]

这些是用于完成问题中自定义代码等效的完整配置设置。

鉴于上面的allowedOrigins值,条件逻辑laravel-cors如下:

  • 如果Origin请求标头值与$origin的值匹配,则返回响应标头Access-Control-Allow-Origin,其值设置为$origin
  • 如果Origin请求标头值为http://app.localhost:3333,则返回响应标头Access-Control-Allow-Origin: http://app.localhost:3333
  • 否则不发回任何Access-Control-Allow-Origin响应标题

如果您想要允许来自$originhttp://app.localhost:3333但不来自任何其他来源的跨源请求,那么这就是您所需要的。

确实与问题中的自定义代码有所不同 - 因为问题中的代码会导致Access-Control-Allow-Origin响应标头的$origin值被发回甚至对于不允许的起源。

但你不想这样做。如果请求来自不允许的来源,则根本不会发回任何Access-Control-Allow-Origin标头 - 因为缺少Access-Control-Allow-Origin响应标头会告诉浏览器“don不允许在此源运行的前端JavaScript代码访问来自我们服务器的响应“

除此之外,公开泄露有关任何允许来源的信息是没有意义的 - 如果您将默认Access-Control-Allow-Origin响应标头设置为$origin,那么您正在做的事情,正如问题中的自定义代码那样。