ProcessWire实现网站群的两种方法及对比
网站群早不是什么新鲜的东西了,市面上大多数方案大概有两种:一是用第三方软件采用数据分发的方式实现管理;二是很多CMS自带的栏目绑定域名的方式。ProcessWire提供了非常强大的多站点解决方案,适用于企业网站群搜索营销、政府网站、集团网站等应用场景。
本页对比ProcessWire支持站点的两种方法优劣,自行斟酌选择:
一 每个网站拥有独立数据库、独立后台
该方案由ProcessWire提供,每个网站拥有自己的数据库及site目录(assets、modules、templates);
优势:
- 网站间相互独立互不干扰,可针对每个网站完成独立维护及项目迁移
- 每个网站(项目)可以设计成不同的用途,拥有独立的字段、模块、模板文件
- 无需担心第三方模块引起某个网站的错误对其它站点的影响
缺点:
- 由于彼此独立运行,网站之间不能很好地实现数据共享
- 每个站点不仅有自己的数据库,而且它的模板文件和模块都是独立的,如果频繁修改维护这是非常大的工作量,这取决于你的需求
- 你每次维护都要独立登录对应站点的后台
如何实现?
在安装多站点前你需要有一个已经安装好的网站,我们暂且称之为主站,在主站扩展的站点我们都成为子站点吧,注意:服务器应该绑定主域名和子站点域名到该目录。
- 在主站点根目录下创建一个名为"
/tmp/
"的子目录(任意名称),在该目录下安装ProcessWire独立副本。 - 完成第一步的安装后将"
/tmp/
"下面的"/site/
"目录重命名并移动至根目录"/site-newname/
",因为主站的目录是"site"所以我们这里必须要重命名成其它名字,该目录会成为子站点标识。 - 如果你不需要安装更多子站点这时候你应该删除掉"/tmp/"目录
- 进入主站点移动文件"
/wire/index.config.php
"到根目录/index.config.php
- 编辑
/index.config.php
文件,按照默认提供的示例代码修改
'newname.com
' => 'site-newname
', - 使用newname.com访问网站,如添加更多子站点请重复第一步开始。
最后你的主站根目录看起来应该是这样子的:
/index.config.php
文件里面的内容应该是这样子的:
function ProcessWireHostSiteConfig() { return array( /* * Some Examples (you should remove/replace them if used). * Just note that the values must begin with 'site-'. * */ 'domaina.com' => 'site-domainA', 'domainb.com' => 'site-domainB', 'domainc.com' => 'site-domainC', /* * Default for all others (typically /site/) * */ '*' => 'site', ); }
二 同一个数据库、统一后台管理
该方法由社区提供,使用第三方Multisite.module来实现。
优势:
- 所有站点使用同一个数据库,实现数据无缝自由调取
- 网站资源(字段、模板、模块)可任意共享
- 统一的管理后台、用户及权限设定
- 可以为每个站点(项目)独立设计功能,并且模板、字段可相互复用
缺点:
- 所有站点数据都运行在同一个库,要想独立出去似乎不太可能了
- 如果某个站点(项目)需要安装第三方模块的时候要当心,如果模块出错会导致全军覆没的,所以需要前期准备好测试工作
- 如果每个站点有很少的模板复用,会需要大量模板文件支持,这会在文件管理上带来一定影响
如何实现?
首先你需要安装一个ProcessWire实例,然后安装Multisite.module
模块,该模块允许配置独立开发环境,非常轻松的完成不同环境的切换。如果你不是一个开发者或不太理解本段内容就全部当生产环境用即可。
1.为config.php添加配置变量
在安装模块完成后修改/site/config.php
文件,添加$config->MultisiteDomains
配置变量:
生产环境:
$config->MultisiteDomains = array( "domain1.com" => array( // domain name can be used to map to root page "root" => "www.domain1.com", // page name for the root page "http404" => 27 ), "domain2.com" => array( "root" => "www.domain2.com", "http404" => 5332 ) );
覆盖为开发环境
$config->MultisiteDomains = array( "dev.domain1.com" => array( // domain name can be used to map to root page "root" => "www.domain1.com", // page name for the root page "http404" => 27 ), "dev.domain2.com" => array( "root" => "www.domain2.com", "http404" => 5332 ) );
2.为httpHosts添加域名访问授权
生产环境
$config->httpHosts = array('olddomain.com', 'domain1.com', 'domain2.com');
开发环境
$config->httpHosts = array('olddomain.com','dev.domain1.com', 'dev.domain2.com');
如果觉得配置两次太麻烦你可以这样:
$config->httpHosts = array_merge( array('olddomain'), array_keys($config->MultisiteDomains));
来合并$config->MultisiteDomains的域名配置。
注意:别忘记将服务器上PW的安装目录绑定所有站点域名,另外domain1.com和domain2.com所指向的目录均为ProcessWire的安装目录。
3.后台页面结构
- Web (ProcessWire根目录) - www.domain1.com (站点1) - Example Page - 404 Page - Contact Page - www.domain2.com (站点2) - 404 Page ...
相关变量
// get current domain echo $modules->get('Multisite')->domain; [dev] 'dev.domain1.com' [live] 'domain1.com' // get current site root $siteRoot = $page->rootParent; echo $siteRoot->name // root page name [dev] 'dev.domain1.com' [live] 'www.domain1.com' // use it as navigation starting point foreach ($siteRoot->children as $child) { echo $child->title; }
总结:
如果你的项目未来没有独立迁出的必要,更推荐使用第二种方法,由于站点之间数据的无缝对接及资源复用,你可以任意扩展子站点,也可以做主站的移动网站(m.yourdomain.com)、百度MIP(mip.yourdomain.com)、Google AMP(amp.yourdomain.com)等等Anything You Wana Do。
2017-01-11更新:
利用主站根目录下的.htaccess
文件统一ProcessWire的网站群地址,更符合SEO URL唯一化标准:
RewriteEngine On RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
此规则会将:
- http://towait.com/$1
- https://towait.com/$1
统一成
- http://www.towait.com/$1
- https://www.towait.com/$1
你不再麻烦地挨个网站去设置.htaccess了,在这里我们只需要一条规则,全部网站受用。
Order allow,deny Deny from 255.0.0.0 Deny from 123.45.6. Allow from all
来达到屏蔽爬虫IP地址的目的
如何屏蔽IP段?
order allow,deny deny from 127.0.55.0/24 // Matches 55 屏蔽127.0.55这个IP段 deny from 127.0.56.0/21 // Matches 56 to 64 屏蔽127.0.56至127.0.64这个IP段 deny from 127.0.64.0/21 // Matches 64 to 71 deny from 127.0.72.0/22 // Matches 72 to 75 deny from 127.0.235.0/24 // Matches 235 deny from 127.0.236.0/22 // Matches 236 to 239 deny from 127.0.240.0/21 // Matches 240 to 255 allow from all
当然相反的,如果你只要你的网站允许部分IP访问
,你可以这么写:
Order deny,allow Deny from all Allow from 255.0.0.0