Laravel 5 特定子域的 Dotenv
Laravel 5 Dotenv for specific subdomain
我的 laravel 5 应用程序中有几个子域,每个子域都有特定的配置,如邮件、nocaptcha 等
如何设置 .env 文件以与我的特定子域一起使用?
你不能。每个子域将 运行 在相同的环境中。
如果您想要针对每个子域进行配置,那么最好的办法是在 config 目录中使用每个子域的设置创建一个配置文件,或者使用数据库方法。
是的,您可以为每个子域使用单独的 .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.phpapp初始化后添加:
//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" ..等等
(当然,您可以像现在一样将其保存在您的根目录中,但对于许多子域,最好移动到一个目录中 => 看起来更干净 => 每个人都很高兴!:))
我遇到了同样的问题,基于@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__.'/../')
);
希望对大家有所帮助
问候
我的 laravel 5 应用程序中有几个子域,每个子域都有特定的配置,如邮件、nocaptcha 等
如何设置 .env 文件以与我的特定子域一起使用?
你不能。每个子域将 运行 在相同的环境中。
如果您想要针对每个子域进行配置,那么最好的办法是在 config 目录中使用每个子域的设置创建一个配置文件,或者使用数据库方法。
是的,您可以为每个子域使用单独的 .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.phpapp初始化后添加:
//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" ..等等
(当然,您可以像现在一样将其保存在您的根目录中,但对于许多子域,最好移动到一个目录中 => 看起来更干净 => 每个人都很高兴!:))
我遇到了同样的问题,基于@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__.'/../')
);
希望对大家有所帮助
问候