我目前有几个网站都使用相同的CMS代码库。 它们都共享相同的包含CMS和库文件的path,每个文件都有一个索引htaccess和configuration文件。
由于这些文件对于每个客户端都是相同的,因此对于所有客户端来说,使用这些文件会更容易。
我有一个想法,我可以在虚拟主机内设置客户端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)
我怎样才能configuration文件结构级联(在某些情况下,我可能想放置一个索引文件在默认域httpdocs文件夹中)。
谢谢。 PS。 无法决定在serverfault或stackoverflow
要做到这一点,您需要做多less工作才能取决于CMS代码库的细节和灵活性。
在制作网站时,我喜欢在每个网站的vhost文件中使用Apache SetEnv指令。 例如
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代码中引用这些环境variables:
//[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...
仅供参考 – 这些path在每个站点的文档根目录之外以保证安全 – 每个站点的文档根目录是/source/site1/www/ 。
感谢从apache虚拟主机(类似于您提到的“客户端ID”)传递所有站点特定的variables,我网站的结构代码( /var/lib/... )保持不变,并且会级联。 特定于站点的代码是通过引用/source/site1path获取的。
为了解决链接到每个特定站点的文档根目录中的共享文件的问题,通常共享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']);
那么我会在docroot 里面做特定的符号链接,返回到共享位置:
ln -s /var/lib/libjs /source/site1/www/_jscripts/library ln -s /var/lib/basecms/jscripts /source/site1/www/_jscripts/shared
最终结果是我的应用程序可以访问的目录结构包含共享的和特定于站点的代码和资产。
tl; dr – 是的,根据您的应用程序的限制,您可以使用Apache中的SetEnv让您的应用程序同时查看常用代码和唯一代码,并在docroot下使用单独的符号链接来“合并”常见和独特的资源。
这个话题是我的最爱 – 如果你想粘贴你的环境的更多细节,很乐意与你分享具体细节。