同一服务器上的 Laravel 4.2 环境
Posted
技术标签:
【中文标题】同一服务器上的 Laravel 4.2 环境【英文标题】:Laravel 4.2 Environments on the same Server 【发布时间】:2014-11-18 05:37:31 【问题描述】:我必须将 Laravel 应用的多个实例部署到唯一的服务器。每个实例都需要不同的数据库配置。基于主机名的默认 Laravel 环境配置对我不起作用,因为所有应用程序都将位于同一台服务器上,因此无法确定使用哪个配置字段。这是我的bootstrap/start.php
文件:
$env = $app->detectEnvironment(array(
'development' => array('Ariels-MacBook-Pro.local'),
'server' => array('srv-hostname'),
));
如果我可以基于域定义环境会很棒(因为我的应用程序区域将位于不同的域上),因此我可以为每个域定义不同的配置(托管在同一台服务器上)
有什么想法吗?
【问题讨论】:
你在使用 nginx 吗?还是阿帕奇? 好吧,我不知道你是怎么用 Apache 做的,但是在 Nginx 中你可以在你的位置块中设置环境变量。意味着不同子域、域或 url 模式的不同变量。然后在您的detectEnvironment
方法中获取此变量。必须有一种方法可以在 Apache 中进行等效操作。也许这里的其他人会知道。如果不看,也许。
This可以帮你结合this
所以这是同一个应用程序,还是同一服务器上的不同应用程序??我会查看 app/config 文件并为每种实例类型进行不同的配置构建(这是假设您的构建像 /var/www/laravel/ 一样托管(此处有不同的应用程序))
它是同一个应用程序,但在不同的文件夹中,例如 /var/www/app1/ /var/www/app2/ /var/www/app3/ 。如何进行不同的配置构建?
【参考方案1】:
Laravel 的 detectEnvironment
方法有一个 nify 功能,您可以在其中通过闭包程序化地确定当前环境。例如,这会将 Laravel 配置为始终使用本地环境。
$env = $app->detectEnvironment(function()
return 'local';
);
域名应该在 $_SERVER 中的某个地方,所以像这个未经测试的伪代码应该可以得到你想要的。
$env = $app->detectEnvironment(function()
switch($_SERVER['HTTP_HOST'])
case: 'example.com':
return 'production';
case: 'another.example.xom':
return 'production';
default:
return 'local'; //default to local
);
【讨论】:
安全吗? laravel.com/docs/4.2/upgrade 出于安全原因,可能不再使用 URL 域来检测您的应用程序环境。这些值很容易被欺骗,并允许攻击者修改请求的环境。您应该将环境检测转换为使用机器主机名(Mac、Linux 和 Windows 上的主机名命令)。 我想为了安全起见,你可以先检查主机名:if(gethostname() == 'server-name')
,然后你可以检查上面显示的 Alan 的 url。【参考方案2】:
我的选择,在文件 app/config/database.php
末尾添加这一行
'enviorement' => 'local',
// 'enviorement' => 'development', // this is for dev
// 'enviorement' => 'production', // this is for production
然后用这个从你的控制器访问
$env = Config::get('database.enviorement');
echo $env;
database.php
文件不同,您的本地另一个用于开发服务器,另一个用于生产,因为有“数据库连接”所以我用它来隐式编写环境。
玩得开心。
【讨论】:
以上是关于同一服务器上的 Laravel 4.2 环境的主要内容,如果未能解决你的问题,请参考以下文章
函数 mcrypt_get_iv_size() 在运行 PHP 7.1.0 的 MAMP 上的 Laravel 4.2 中已弃用
Laravel 4.2 Route HTTPS 在服务器上不起作用