我可以为需要不同的事物(如数据库连接、SMTP设置等)的许多vhost共享代码库的人添加解决方案。
对于每个vhost,在Apache上创建一个vhost配置文件:
<VirtualHost *:80>
ServerName your-vhost.yourdomain.com
DocumentRoot /var/www/shared-codebase/public
SetEnv VHOST_NAME 'your-vhost'
<Directory "/var/www/shared-codebase/public">
Options Indexes MultiViews FollowSymLinks
AllowOverride all
Order deny,allow
Require all granted
</Directory>
<IfModule mpm_itk_module>
AssignUserId your-vhost your-vhost
</IfModule>
ErrorLog /var/www/your-vhost/logs/error.log
CustomLog /var/www/your-vhost/logs/access.log combined
</VirtualHost>
所有虚拟主机都有相同的文档根目录和目录,因为它是共享的代码库。在配置中,我们添加了一个
SetEnv VHOST_NAME 'your-vhost'
,稍后我们将在 Laravel 的 bootstrap.php 中使用它来更改虚拟主机特定的
.env
的位置。
接下来,在文件夹中创建自定义的
.env 文件
(例如 /var/www/your-vhost/.env),然后修改
bootstrap.php
以从正确的位置加载 .env。
<?php
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
);
$app->useEnvironmentPath('/var/www/'.$_SERVER['VHOST_NAME']);
return $app;
这就是全部内容。
[编辑]
如果你想针对特定的数据库或为特定的.env生成密钥,那么你应该在artisan命令前面放置VHOST_NAME。
VHOST_NAME=tenant2.domain.com php artisan key:generate
[编辑] 当您在本地工作并使用Laravel Valet时,可以在代码库的根目录中添加自定义.valet-env.php
。详情请参考:https://laravel.com/docs/master/valet#site-specific-environment-variables
load
不是一个静态方法,而且直接访问Dotenv
可能不是最好的方式,但你给了我很好的想法,我想到了我的答案 - 使用$app->loadEnvironmentFrom($envFile);
代替。谢谢! - SmxCde$app->useEnvironmentPath('/var/www/'.$_SERVER['VHOST_NAME']);
指向不同的目录。这解决了我的共享代码库和不同虚拟主机的问题。然后你的VHOST配置可以有一个SetEnv ```<VirtualHost *:80> ServerName yoursub.domain.com DocumentRoot /var/www/yoursub/publicSetEnv VHOST_NAME 'yoursub'```。
- Skid Kadda