做视频站的站长一直以来都很想做一件事,就是能跟虾皮电商网站一样,可以控制游客禁止访问网站,而同时又能够让蜘蛛爬虫顺利访问网站,这个功能是非常需要的功能,可以防止有心人士恶意举报,因为一些敏感信息在中国是相当容易被屏蔽和谐的,中国三大电信商很快的就会将你的域名锁定,把你的域名解析到 127.0.0.1 或者 0.0.0.0,当然有些电信商节点会把你解析到 Facebook、Twitter,但是他们这么做基本上就是禁止中国用户去访问你架设的网站。
那么视频站也会面临这种问题,所以我们应该如何”降低”这种风险? 虽然这个功能还是会有被举报的风险,但是可以让恶意举报的人举报难度提高非常多,这些无聊人士会利用程序自动化举报,甚至有的直接勾串电信业者直接勒索站长付钱才会解禁,我相信这些事情很多人都发生过。
苹果cms是开源的影视系统程序,由于它是开源的,所以维护的人非常少,因此有许多的漏洞或需要改善的空间,那我就针对蜘蛛与真实用户的权限判断来作介绍,到底要如何实现这个功能?
在 maccms v10 目录底下找到 application/index/controller/Base.php
Base.php 文件里面是一个类(class),它命名为 Base
有一个 function 命名为 __construct()
public function __construct()
{
parent::__construct();
$this->check_site_status();
$this->label_maccms();
$this->check_browser_jump();
$this->label_user();
}
在 function __construct() 里面添加两行代码
$this->SpiderLogin();
$this->assign('user', (isset($GLOBALS['user']) ? $GLOBALS['user'] : null));
然后在 Base 类里面宣告两个 private function,一个函数是用来判断是否为蜘蛛,以及蜘蛛的 User-Agent,而另一个函数就是将这些蜘蛛指派为「默认会员」。
由于 maccms 的会员组的功能并不是很完善,因此只能把蜘蛛配置为默认会员组,额外添加的会员组都是毫无意义的。
测试功能是否有被正确运行,我们可以使用 pagespeed insights 来查看状况,如果你分析完是停在:
那表示没有成功,你就要再次调整代码,直到成功为止。

pagespeed insights 的 User-Agent 字串包含:Chrome-Lighthouse
页面缓存
当页面缓存开启之后,你会发现到所有用户,包含会员或一般访客都会使用同一个缓存页面,这样子被过滤的数据就会有冲突,如果用会员session进行缓存,那么一般访客就会看到被过滤的数据,虽然详情页跟播放页有阻挡,但是首页还是会被显示。
因此我们在页面缓存机制的功能这边要做一些优化。

这边针对页面缓存功能进行改进,首先,找到 /application/common/controller/All.php
找到下面这个函数
protected function load_page_cache($tpl,$type='html')
{
if(defined('ENTRANCE') && ENTRANCE == 'index' && $GLOBALS['config']['app']['cache_page'] ==1 && $GLOBALS['config']['app']['cache_time_page'] ) {
$cach_name = $_SERVER['HTTP_HOST']. '_'. MAC_MOB . '_'. $GLOBALS['config']['app']['cache_flag']. '_' .$tpl .'_'. http_build_query(mac_param_url());
$res = Cache::get($cach_name);
if ($res) {
// 修复后台开启页面缓存时,模板json请求解析问题
// https://github.com/magicblack/maccms10/issues/965
if($type=='json' || str_contains(request()->header('accept'), 'application/json')){
$res = json_encode($res);
}
echo $res;
die;
}
}
}
这个函数是针对所有人进行缓存,所以并没有区分是一般访客还是会员,所以我们要改变他的写法
protected function load_page_cache($tpl,$type='html')
{
if(defined('ENTRANCE') && ENTRANCE == 'index' && $GLOBALS['config']['app']['cache_page'] == 1 && $GLOBALS['config']['app']['cache_time_page'] ) {
// 判断身份(蜘蛛 / 会员 / 游客)
$identity = 'guest';
if (!empty($GLOBALS['user'])) {
$identity = 'member';
} elseif ($this->isSpider()) {
$identity = 'spider';
}
// 构建缓存名
$cach_name = $_SERVER['HTTP_HOST']. '_'. MAC_MOB . '_'. $GLOBALS['config']['app']['cache_flag']. '_' .$tpl .'_'. http_build_query(mac_param_url()). '_' . $identity;
$res = Cache::get($cach_name);
if ($res) {
// 修复后台开启页面缓存时,模板json请求解析问题
if($type=='json' || str_contains(request()->header('accept'), 'application/json')){
$res = json_encode($res);
}
echo $res;
die;
}
}
}
因为蜘蛛=会员,但在缓存功能这边,我们还是将蜘蛛跟会员分开进行缓存,以便于日后延伸开发。
修改完之后,我们再将缓存页面功能打开,缓存时间自行设定,你可以检查前台页面渲染,看看是否过滤数据有被显示出来,如果没有就表示成功。