【问题标题】:Laravel 5 Dotenv for specific subdomainLaravel 5 Dotenv 用于特定子域
【发布时间】:2015-07-04 23:54:56
【问题描述】:

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

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

【问题讨论】:

    标签: laravel laravel-5 phpdotenv laravel-environment


    【解决方案1】:

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

    【讨论】:

    • @Artistan 可能您使用的是较新版本的框架,您需要以不同的方式加载它(这是 1 年多以来的帖子)。
    • 非常感谢,构建我的解决方案非常有帮助,here,这适用于 laravel 5.2 :) 问候
    【解决方案2】:

    我发现的最佳解决方案是使用 .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”..等

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,根据@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__.'/../') );

        希望对大家有所帮助

        问候

        【讨论】:

        • 请注意,可能并不总是设置 HTTP_HOST。例如,当您运行 artisan 命令时,它不会被设置
        猜你喜欢
        • 2015-03-18
        • 2015-09-02
        • 2015-09-10
        • 1970-01-01
        • 2015-10-01
        • 2016-08-14
        • 2015-07-02
        • 2020-08-30
        相关资源
        最近更新 更多