我以前使用自定义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;
}
答案 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
响应标题如果您想要允许来自$origin
或http://app.localhost:3333
但不来自任何其他来源的跨源请求,那么这就是您所需要的。
确实与问题中的自定义代码有所不同 - 因为问题中的代码会导致Access-Control-Allow-Origin
响应标头的$origin
值被发回甚至对于不允许的起源。
但你不想这样做。如果请求来自不允许的来源,则根本不会发回任何Access-Control-Allow-Origin
标头 - 因为缺少Access-Control-Allow-Origin
响应标头会告诉浏览器“don不允许在此源运行的前端JavaScript代码访问来自我们服务器的响应“。
除此之外,公开泄露有关任何允许来源的信息是没有意义的 - 如果您将默认Access-Control-Allow-Origin
响应标头设置为$origin
,那么您正在做的事情,正如问题中的自定义代码那样。