Laravel 5 Dotenv для конкретного субдомена

У меня есть несколько поддоменов в моем приложении laravel 5, каждый поддомен имеет определенную конфигурацию, такую ​​как mail, nocaptcha и т. Д.

Как настроить файл.env для работы с моим конкретным поддоменом?

4 ответа

Решение

Да, вы можете использовать отдельные .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 ваших поддоменов.

Лучшее решение, которое я нашел, - это использовать.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' );

Создайте новый каталог с именем "env" в корне Laravel и добавьте ваши файлы конфигурации как:

  • "Sub1.env",
  • "sub2.env".. и т. д.

(Конечно, вы можете сохранить его в своем корне, как в настоящее время, но для многих поддоменов лучше перейти в каталог => выглядит намного чище => все счастливы!:))

Ты не можешь Каждый поддомен будет работать в одной среде.

Если вам нужна конфигурация для каждого субдомена, лучше всего создать файл конфигурации в каталоге config с настройками каждого субдомена или использовать подход с использованием базы данных.

У меня была та же проблема, основываясь на ответе @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__.'/../') );

Я надеюсь, что это помогает кому-то

Привет

Другие вопросы по тегам