mikenz /silverstripe-simplesubsites
从单个SilverStripe安装运行多个网站。
Requires
- silverstripe/cms: ~3.1.0
- silverstripe/framework: ~3.1.0
This package is not auto-updated.
Last update: 2024-09-28 18:00:05 UTC
README
这是Silverstripe Subsites模块的一个分支。
与Subsites模块的不同之处
- 移除了“主站”的概念 - 所有子站都是平等的
- 兼容Silverstripe 4.0
- 移除了“文件”中的子站选项,给人以文件只会在一个域名上可用的错觉
- 无论选择哪个子站,主菜单项都是可用的
- 移除了‘启用公共访问’和‘默认站点’功能。这应该在请求到达Silverstripe之前完成(例如,通过缓存/SSL终止设备或Web服务器配置)。
这应该可以替代silverstripe subsites模块,除非您进行一些数据库操作,否则您将无法访问“主站”的所有页面。
简介
子站模块提供了一个方便的方法,可以从单个SilverStripe安装运行多个网站,并允许它们之间共享用户、内容和资产 - 网站将从一个单一的CMS进行管理。
考虑其使用的一个有用方式是,您有一个拥有全球总部和四个分布在不同国家的分支机构的业务。子站模块允许五个办事处使用单个SilverStripe安装,并将总部信息流入分支机构。分支机构可以保留个别信息,并且网站模板也可以不同。
使用此模块实现的所有内容分离都应视为装饰性的,并不适用于安全关键的应用程序。模块在CMS的“页面”和“文件”区域提供一些对访问权限的控制,但其他部分的分离要弱得多:例如,给某人“角色和访问权限”中的任何一个,都可能意味着这个人可能会将他的/她的权限提升到全局管理员角色。有关用户文档,请参阅
功能 & 限制
功能
- 从用户的角度来看,每个子站都作为一个独立的网站出现
- 无需复制现有代码,因为所有子站都使用与主站相同的代码库
- 可以为每个子站域名设置单独的权限
- 可以从主站复制页面及其内容到子站
- 创建子站页面的翻译
- 安排子站页面的发布
- 数据库在子站之间是共享的(这意味着复制内容很容易)
- 在灾难恢复时,启动一个包含100个子站的单个环境副本比启动100个环境副本要容易得多。
限制
- 必须首先在服务器上设置每个子站域名,并且需要更新适当的DNS记录。
- 子站不能使用与主站不同的代码库,它们本质上是相互关联的
- 然而,在创建子站时,可以移除子站中的页面类型 - 有关更多详细信息,请参阅设置文档
- 开发人员之间可以编辑的唯一代码是主题
- 在CMS中,子站点的分离应被视为装饰性的,主要适用于CMS的“页面”和“文件”部分。
- 所有子站点都在同一进程空间和数据集中运行。因此,如果一个子站点的故障会影响所有子站点,如果不良代码或硬件损坏了一个子站点的数据,那么它很可能已经损坏了所有子站点的数据。
- 此原则适用于应用程序错误、安全漏洞和高流量。
- 目前无法备份或恢复单个子站点的数据。
- 让不同的开发团队在不同的子站点上工作可能很尴尬(但并非不可能),主要是因为所需的协作水平。更适合由同一组的开发人员负责所有子站点。
如果需要更多的代码、安全或性能隔离,请考虑运行多个单独的安装(例如,在单独的服务器上)。
要求
- 银Stripe 4.x
安装
- 通过访问
http://<yoursite>/dev/build创建必要的表(你应该会看到创建了“子站点”表等)。你不需要为每个子站点运行此命令。 - 以管理员身份登录到CMS。现在你应该在主菜单上看到“子站点”条目,现在访问该部分。
- 点击“添加子站点”按钮以创建新的子站点。
- 创建子站点后,你会看到一个“创建子站点域名”按钮,点击该按钮输入子站点的域名或子域名。这将确定您的网站URL。例如,如果您的网站在
https:///mysite上运行,并且将子域名设置为“subsite”,那么您的子站点将在http://subsite.localhost/mysite上可用。 - 转到CMS的“页面”部分。在菜单的右上角,您将看到一个列出两个子站点的下拉菜单——“主站点”是在您安装子站点模块之前拥有的原始站点。选择您的新子站点,然后网站内容树将更改。在此阶段应该是空的。
- 添加一个页面 - 将其标题更改为“首页”,并将其URL段更改为“home”。保存页面。
- 更新您的DNS和(如果需要)您的Web服务器配置,以便您的子域名指向您的Web服务器上的SilverStripe安装。访问此新子域名。您应该看到新的子站点主页。
用法
严格的子域名匹配
该模块试图提供合理的默认值,其中它将 example.com 和 www.example.com 视为相同的域名。如果您想区分这些变体,将 Subsite::$strict_subdomain_matching 设置为TRUE。这不会影响通配符/星号检查,但消除了默认子域名的歧义。
权限
可以将组关联到一个或多个子站点,在这种情况下,授予的页面和资产相关权限仅适用于此子站点。
请注意,创建特定的子站点组并授予与之无关的权限(如内容编辑和资产管理)将导致该组的成员能够提升其权限。这里的一个例子是授予该组“完全管理权限”或某些“角色和访问权限”,在这种情况下,该组的成员可以简单地将自己添加到全局的“管理员”组或更改自己的组以访问所有网站。
应将子站点模块视为在接口级别为网站提供视觉分离的便利,而不是在同一个CMS上管理许多站点的完整紧密的安全模型(它仍然是同一个CMS)。
访问创建的域名
一旦在您的管理中创建了一些子站点/域名,您可以通过以下方式检查子站点的整体功能:
http://your.primary-domain.com/subsite-metadata-url?SubsiteID=1
在某些浏览器中,当您将鼠标悬停在子站点管理器的搜索结果中的“编辑”链接上时,SubsiteID是可见的。
在DataObjects上启用子站点支持
要使您的DataObject对子站点有意识,请在您的DataObject中包含SubsiteID。例如:
MyDataObject.php
:::php
private static $has_one = array(
'Subsite' => 'Subsite'
);
在getCMSFields或updateCMSFields中包含当前SubsiteID作为隐藏字段。例如:
MyDataObject.php
:::php
public function getCMSFields() {
$fields = parent::getCMSFields();
if(class_exists('Subsite')){
$fields->push(new HiddenField('SubsiteID','SubsiteID', Subsite::currentSubsiteID()));
}
return $fields;
}
为了限制您的管理网格字段仅显示当前Subsite的记录,您可以这样做:
MyAdmin.php
:::php
public function getEditForm($id = null, $fields = null){
$form = parent::getEditForm($id, $fields);
$gridField = $form->Fields()->fieldByName($this->sanitiseClassName($this->modelClass));
if(class_exists('Subsite')){
$list = $gridField->getList()->filter(array('SubsiteID'=>Subsite::currentSubsiteID()));
$gridField->setList($list);
}
return $form;
}
启用子站点的自定义区域菜单支持
默认情况下,自定义管理区域不会显示在子站点的菜单中。并非所有管理员都适合或适用于在子站点中显示。如果您的管理员具有子站支持或故意为全局设置,您可以通过以下方式启用显示在菜单中的选项:
mysite/_config.php
:::php
MyAdmin::add_extension('SubsiteMenuExtension');
或者在您的管理员中定义subsiteCMSShowInMenu函数
MyAdmin.php
:::php
public function subsiteCMSShowInMenu(){
return true;
}
子站点的公共显示
为确保成员的登录状态跨子域传递,您还需要配置PHP会话Cookie以对所有子域进行设置
// Example matching subsite1.example.org and www.example.org
Session::set_cookie_domain('.example.org');
