如何在 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 5 种用于开发和生产的不同日志级别

如何使用 laravel 在引导模式中为每个 id 获取动态数据?

如何在 laravel 中为两种不同的控制器功能方法使用相同的路由

Laravel 排队作业的问题。开发和生产的奇怪行为不同

仅在 Laravel 5 中为一个环境启用全局中间件