Laravel 5 Dotenv 用于特定子域

问题描述 投票:0回答:4

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

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

laravel laravel-5 phpdotenv
4个回答
5
投票

是的,您可以为每个子域使用单独的

.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.app
abc.testing.app
def.testing.app
,您可以为主域(以及所有没有自定义 env 文件的子域)创建
.env
文件) 和
.abc.env
.def.env
文件,用于子域的自定义环境变量。


4
投票

我发现的最佳解决方案是使用 .htaccess 加上环境变量。

.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”..等

(当然,您可以像当前一样将其保留在根目录中,但对于许多子域来说,最好移至目录中 => 看起来更干净 => 每个人都很高兴!:) )


0
投票

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

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


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__.'/../')
);

我希望对某人有帮助

问候

© www.soinside.com 2019 - 2024. All rights reserved.