如何在 laravel 中为开发和生产使用不同的 cors 配置
Posted
技术标签:
【中文标题】如何在 laravel 中为开发和生产使用不同的 cors 配置【英文标题】:How to have different cors configuration for development and production in laravel 【发布时间】:2019-07-14 12:52:13 【问题描述】:我在 Laravel 中为生产和开发设置不同的 cors 配置时遇到了一些问题:
<?php
return [
/*
|--------------------------------------------------------------------------
| Laravel CORS
|--------------------------------------------------------------------------
|
| allowedOrigins, allowedHeaders and allowedMethods can be set to array('*')
| to accept any value.
|
*/
'supportsCredentials' => false,
'allowedOrigins' => ['https://www.example.com'],
'allowedHeaders' => ['*'],
'allowedMethods' => ['*'],
'exposedHeaders' => [],
'maxAge' => 0,
];
【问题讨论】:
列出所有这些可能是安全的。或者,您可以在配置文件中进行 env('APP_ENV') 开关并返回 $config 而不是 return []。 【参考方案1】:让服务器处理
CORS 标头可以由您的 HTTP(S) 服务器发送,因此您只需配置两个服务器即可为您设置标头。除非你在域之间请求或使用 websockets,否则你真的不需要弄乱 Laravel 的默认 CORS 设置,它应该使用.env
中的 APP_URL 进行设置。即使使用 websockets 或 echo,必须更改的标头也是 websocket 服务器端的标头。
使用 .env
这样做的首选方法是保留 2 个不同的 .env
文件,一个用于开发和生产。在你的 .envs 中设置一个变量:
AllowedOringin=[https://www.example.com]
#etc.
然后在配置中引用 env,如果未设置,请给出合理的默认值:
'allowedOrigins' => [env('AllowedOrigin',['https://www.example.com'])],
//etc.
或者检查环境
或者,您可以检查您所在的环境并在配置中设置值。这不被认为是健壮或易于修改的,但实际上两者在逻辑上是等价的。
AllowedOrigin => (App::environment() == 'production') ? ['https://www.example.com'] : ['*'],
//etc.
【讨论】:
【参考方案2】:<?php
switch(env('APP_ENV'))
case 'development':
return [... config array ...];
break;
case 'staging':
return [... config array ...];
break;
case 'production':
return [... config array ...];
break;
【讨论】:
【参考方案3】:正确的做法是使用env
辅助函数从.env
文件中检索变量。
如下更改你的 cors.php
<?php
return [
/*
|--------------------------------------------------------------------------
| Laravel CORS
|--------------------------------------------------------------------------
|
| allowedOrigins, allowedHeaders and allowedMethods can be set to array('*')
| to accept any value.
|
*/
'supportsCredentials' => env('supportsCredentials', false),
'allowedOrigins' => env('allowedOrigins', ['https://www.example.com']),
'CONFIG_KEY' => env('CONFIG_KEY', *default_value*),
...
];
现在在您的 .env 文件中指定环境特定 cors 键的值。
【讨论】:
以上是关于如何在 laravel 中为开发和生产使用不同的 cors 配置的主要内容,如果未能解决你的问题,请参考以下文章
如何在单个 iOS 项目/应用程序中为发布和调试模式(测试和生产环境)制作不同的 Firebase 数据库?
如何使用 laravel 在引导模式中为每个 id 获取动态数据?