我有两个网站,websitea 和 websiteb。
我让它们都指向同一个文档根目录并且一切正常,但是我希望网站 a 具有与网站 b 不同的数据库详细信息。
数据库详细信息存储在 /config/database.php 中
我可以只需在该 php 文件中编写一个 if 语句来告诉它根据主机名使用哪个数据库详细信息,但是我打算添加另外 10 个这样的网站,这很快就会变得麻烦。
第二个问题是我有一个名为 /images/ 的文件夹,其中包含用户上传的图片,这些图片再次需要有所不同。
当我第一次考虑这个问题时,我想我可以使用 apache 别名 - 然而这对 php 不起作用,因为这样做
<?php include('config/database.php');?>
将不会遵循别名(不是网络请求,而是本地目录查找)因此将失败。
所以我有点困惑:)
有人有什么想法吗?
答案1
只需对站点根文件夹中的所有文件和目录使用符号链接。
答案2
我有几个您可能需要考虑的解决方案,但它们确实有缺点,它们还假设您正在使用 Linux 或其他 *nix。
您可以在此处使用的一个选项是使用联合文件系统。Unionfs 基本上提供了一种合并两个文件系统的方法。缺点是,默认情况下,并非所有系统都提供 unionfs。您可能需要重新编译内核。
所以基本上你可以设置类似这样的内容
/srv/www/basefolder (all the common files
/srv/www/localstuff/site1.example.org (files unique to a specific site)
/srv/www/localstuff/site2.example.org
/srv/www/localstuff/siten.example.org
/srv/www/unions/site1.example.org (unionfs ro:/srv/www/basefolder + rw:/srv/www/localstuff/site1.example.org)
/srv/www/unions/site2.example.org (unionfs ro:/srv/www/basefolder + rw:/srv/www/localstuff/site2.example.org)
/srv/www/unions/siten.example.org (unionfs ro:/srv/www/basefolder + rw:/srv/www/localstuff/siten.example.org)
另一种选择是简单地使用硬链接。使用 rsync 可以很容易地完成此设置。缺点是,如果您不注意,可能会破坏许多网站。如果您忘记将所有内容硬链接在一起,并且对一个位置的文件进行更改,则所有位置的文件都会更改。每当更新文件时,您还需要重新运行 rsync 命令。
/srv/www/basefolder (all the common files
/srv/www/site1.example.org
/srv/www/site2.example.org
使用如下命令来构建此结构
rsync -vr /srv/www/basefolder /srv/www/site1.example.org --link-dest /srv/www/basefolder
rsync -vr /srv/www/basefolder /srv/www/site2.example.org --link-dest /srv/www/basefolder
答案3
是否可以将所有公共内容放在单独的位置,并创建多个包含不同配置文件和图像文件夹以及指向公共数据目录的符号链接的文档根目录?您甚至可以创建一个 bash 脚本来自动部署此结构。
答案4
目前尚不清楚 /images/ 文件夹的用途或您有多少个 php 脚本。
但是,可以重写 php 以使用 config/HTTP_HOST.database.php,这样它就可以随着您添加虚拟主机而扩展。如果 php 代码使用 /images 或创建指向 /images 的链接,则可以重写它以使用 HTTP_HOST(从 Apache 传入)。如果链接来自另一个应用程序,您可以使用 apache 重写规则将 vhost 信息放入对 /images/ 的请求中,这样您最终会得到看起来像 /images/ 但映射到磁盘上唯一内容的目录。
有关 php 中 HTTP_HOST 的更多信息:
http://lab.artlung.com/echo-http-host/
该解决方案将消除为每个用户部署复制数据的需要,但确实需要更改代码,甚至可能需要重写 apache 中的规则。