为域名提供相同的级联文件夹

为域名提供相同的级联文件夹

我目前有几个网站都使用相同的 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 下的单独符号链接来“合并”通用和唯一的资产。

这个话题是我的最爱 - 如果您想粘贴有关您的环境的更多细节,我们很乐意与您讨论细节。

相关内容