我目前有几个网站都使用相同的 CMS 代码库。它们都共享相同的 CMS 和库文件包含路径,每个都有索引、htaccess 和配置文件。
由于这些文件对于每个客户端都是相同的,因此我可以更轻松地对所有客户端使用相同的文件。
我有一个想法,我可以在虚拟主机内设置客户端 ID。如果我没有其他需要放在域文件夹中的文件(我可以符号链接这两个文件夹,或者将 documentroot 设置为每个域的基本“公共”目录),那么这一切都会很有效……但不幸的是,有些数据文件需要放在域文件夹中。
因此,理想情况下,我想要一个像这样的结构:
/var/lib/library
/var/lib/cms
/var/www/vhosts/site1
.data files and folders (no index, htaccess file etc)
/var/www/vhosts/site2
.data folders and files (no index, htaccess file etc)
/var/www/public
index.php (which calls the cms bootstrap)
我如何配置它以使文件结构向下级联(在某些情况下,我可能希望将索引文件放在默认域 httpdocs 文件夹中)。
谢谢。ps. 无法决定使用 serverfault 还是 stackoverflow
答案1
为实现这一目标您需要做多少工作将取决于您的 CMS 代码库的细节和灵活性。
当我创建网站时,我喜欢使用 ApacheSetEnv
指令在我的每个网站vhost
文件中。例如
SetEnv BASECMS /var/lib/basecms/
SetEnv SHAREDLIBS /var/lib/sharedlibs/
SetEnv CLASSPATH /source/site1/classes/
SetEnv VIEWPATH /source/site1/views/
SetEnv CONFIGPATH /source/site1/configs/
SetEnv _JSCRIPTS /source/site1/www/_jscripts/
SetEnv _IMAGES /source/site1/www/_images/
SetEnv _CSS /source/site1/www/_css/
php
然后我可以在我的代码中引用这些环境变量:
//[path definitions]
// php paths - all have trailing slashes
define('BASECMS', $_SERVER['BASECMS']); // in /var/lib/basecms
define('SHAREDLIBS', $_SERVER['SHAREDLIBS']); // in /var/lib/sharedlibs
define('CLASSPATH', $_SERVER['CLASSPATH']); // in /source/site1...
define('VIEWPATH', $_SERVER['VIEWPATH']); // in /source/site1...
define('CONFIGPATH', $_SERVER['CONFIGPATH']); // in /source/site1...
仅供参考 - 这些路径是外部每个站点的文档根目录,出于安全考虑 - 每个站点的文档根目录是/source/site1/www/
。
由于从 apache vhost 传递了所有特定于站点的变量(类似于您提到的“客户端 ID”),我的站点的结构代码 ( /var/lib/...
) 保持不变并将向下级联。特定于站点的代码是通过对路径的引用获取的/source/site1
。
为了解决链接到共享文件的问题里面每个特定站点的 docroot,通常是共享的 css/javascript/img 文件,正如您所说的那样:
如果我没有其他需要放在域文件夹中的文件,那么这一切都会很好...但不幸的是,有些数据文件需要放在域文件夹中。
我将做出更多定义,特别是针对我需要分享的内容:
// js, css, image paths some unique to each site, some shared/library used by all
define('JSPATH', $_SERVER['_JSCRIPTS']);
define('LIBRARYJSPATH', JSPATH.'library'); // to be symlinked under docroot
define('SHAREDJSPATH', JSPATH.'shared'); // to be symlinked under docroot
define('CSSPATH', $_SERVER['_CSS']);
define('IMAGEPATH', $_SERVER['_IMAGES']);
然后我将创建特定的符号链接里面文档根目录,返回到共享位置:
ln -s /var/lib/libjs /source/site1/www/_jscripts/library
ln -s /var/lib/basecms/jscripts /source/site1/www/_jscripts/shared
最终结果是我的应用程序可访问的目录结构,其中包含共享和站点特定的代码和资产。
tl;dr - 是的,根据您应用程序的限制,您可以SetEnv
在 apache 中使用它让您的应用程序同时看到通用和唯一的代码,并使用 docroot 下的单独符号链接来“合并”通用和唯一的资产。
这个话题是我的最爱 - 如果您想粘贴有关您的环境的更多细节,我们很乐意与您讨论细节。