Laravel 5 Dotenv用于特定子域

时间:2015-04-26 16:32:40

标签: laravel laravel-5 laravel-environment laravel-dotenv

我的laravel 5应用程序中有一些子域,每个子域都有一个特定的配置,如mail,nocaptcha等。

如何设置.env文件以使用我特定的子域?

4 个答案:

答案 0 :(得分:3)

是的,您可以为每个子域使用单独的.env文件,因此如果您在配置中使用env变量,它将无需很多修改即可使用。

使用以下内容创建bootstrap/env.php文件:

<?php
$app->detectEnvironment(function () use ($app) {
    if (!isset($_SERVER['HTTP_HOST'])) {
        Dotenv::load($app['path.base'], $app->environmentFile());
    }

    $pos = mb_strpos($_SERVER['HTTP_HOST'], '.');
    $prefix = '';
    if ($pos) {
        $prefix = mb_substr($_SERVER['HTTP_HOST'], 0, $pos);
    }
    $file = '.' . $prefix . '.env';

    if (!file_exists($app['path.base'] . '/' . $file)) {
        $file = '.env';
    }

    Dotenv::load($app['path.base'], $file);
});

现在修改bootstrap/app.php以加载自定义env.php文件。只需添加:

require('env.php');

$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

现在,您可以为每个域创建单独的env文件,例如,如果您使用testing.appabc.testing.appdef.testing.app,您可以为主域提供.env文件(以及所有不具有自定义环境文件的子域名以及自定义环境变量的.abc.env.def.env文件是您的子域名。

答案 1 :(得分:1)

我找到的最佳解决方案是使用.htaccess和env变量。

.htaccess 中添加以下行:

<If "%{HTTP_HOST} == 'sub.domain'">
    SetEnv APP_DOMAIN sub
</If>

bootstrap / app.php 中,在应用初始化后添加:

//own env directory for separate env files
$app->useEnvironmentPath( realpath(__DIR__ . '/../env/') );
//separate files for each domain (see htaccess)
$app->loadEnvironmentFrom( getenv('APP_DOMAIN') . '.env' );

在Laravel根目录中创建一个名为“env”的新目录,并将配置文件添加为:

  • “sub1.env”,
  • “sub2.env”.. etc

(当然你可以把它保存在你的根目录中,但对于许多子域名,最好进入目录=&gt;看起来更干净=&gt;大家都很开心!:))

答案 2 :(得分:0)

你做不到。每个子域都将在相同的环境中运行。

如果您需要按子域配置,那么最好的办法是在 config 目录中使用每个子域的设置创建配置文件,或者使用数据库方法。

答案 3 :(得分:0)

我遇到了同样的问题,基于@ Marcin的答案,我建立了这个问题(与laravel 5.2.X合作)

我在bootstrap / app.php中添加了

if (isset($_SERVER['HTTP_HOST'])) {
    $hostArray = explode('.', $_SERVER['HTTP_HOST']);
    //if the address is a subdomain and exist the .xxx.env file
    $envFile = sprintf('.%s.env', $hostArray[0]);
    if (count($hostArray) >  2 && file_exists(sprintf('%s/%s', $app['path.base'], $envFile))) {
        $app->loadEnvironmentFrom($envFile);
    }
}

之后

$app = new Illuminate\Foundation\Application( realpath(__DIR__.'/../') );

我希望能帮到某人

问候