同一服务器上的 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 环境的主要内容,如果未能解决你的问题,请参考以下文章

从 laravel 4.2 上的按钮行获取数据

函数 mcrypt_get_iv_size() 在运行 PHP 7.1.0 的 MAMP 上的 Laravel 4.2 中已弃用

Laravel 4.2 Route HTTPS 在服务器上不起作用

Laravel 4.2 应用程序在上传实时服务器后发生不必要的重定向

Laravel 4.2 服务 mp3 - 不可缠绕

Composer - Forked Laravel 4.2 未安装