redis = Redis::instance();
//$this->domain = $request->domain();
$this->domain = UrlService::instance()->getUnlimitDomainOriginWxUrl()->data;
$this->path = $request->path();
$this->param = $request->param();
# redis_key => FFSN:wx7610e3344bdea6f6.dev.kpread.com
$host_redis_key = DomainBlackList::REDISPREFIX . $this->formatDomain($this->domain);
$redis_rules = $this->redis->hGetAll($host_redis_key);
Log::info('domain black rules:' . json_encode($redis_rules, JSON_UNESCAPED_UNICODE));
$result = false;
if($redis_rules){
foreach ($redis_rules as $rule => $item_type){
if($item_type == DomainBlackList::LOCKALLDOMAIN){
if($rule == $this->formatDomain($this->domain)){
$result = true;
break;
}
} elseif($item_type == DomainBlackList::LOCKDOMAINBYPARAM) {
parse_str($rule, $param_arr);
$param_flag = false;
foreach ($param_arr as $arg_key => $arg_value) {
if (array_key_exists($arg_key, $this->param) && $arg_value == $this->param[$arg_key]) {
$param_flag = true;
}
}
if ($param_flag) {
$result = true;
break;
}
}elseif($item_type == DomainBlackList::LOCKDOMAINBYPATH){
if ($rule == $this->path) {
$result = true;
break;
}
}
}
}
//$result = $this->validateRule();
if ($result) {
# 跳转到 404 页面
http_response_code(404);
header('HTTP/1.1 404 Not Found');
$html = "
页面无法访问页面走丢了!
";
echo $html;
exit();
}
}
/**
* 进行规则校验,成功返回true;
* @return bool|string
*/
public function validateRule()
{
$rules = $this->getValidateRule();
foreach ($rules as $key => $item) {
foreach ($item as $k => $v) {
if ($key == self::ALLDOMAIN) {
# 仅校验 domain
if ($this->domain == $v['domain']) {
return true;
break;
}
} elseif ($key == self::DOMAINBYPARAM) {
if ($this->domain == $v['domain']) {
parse_str($v['param'], $param_arr);
$param_flag = false;
foreach ($param_arr as $arg_key => $arg_value) {
if (array_key_exists($arg_key, $this->param) && $arg_value == $this->param[$arg_key]) {
$param_flag = true;
}
}
if ($param_flag) {
return true;
break;
}
}
} elseif ($key == self::DOMAINBYPATH) {
# 仅校验 domain
if ($this->path == $v['path']) {
return true;
break;
}
}
}
}
}
/**
* 获取域名黑名单的校验规则
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getValidateRule()
{
$blackListModel = new Blacklist();
$black_roles = $blackListModel->where('status', '=', 'active')->order('type')->select();
$black_group = [];
if ($black_roles) {
foreach ($black_roles as $k => $v) {
if ($v['type'] == DomainBlackList::LOCKALLDOMAIN) {
$black_group[self::ALLDOMAIN][] = $v;
} elseif ($v['type'] == DomainBlackList::LOCKDOMAINBYPARAM) {
$black_group[self::DOMAINBYPARAM][] = $v;
} elseif ($v['type'] == DomainBlackList::LOCKDOMAINBYPATH) {
$black_group[self::DOMAINBYPATH][] = $v;
}
}
}
return $black_group;
}
public function getRedisRules()
{
$this->redis = Redis::instance();
$rules = $this->redis->hGetAll();
}
/**
* @param $domain
* @return mixed
*/
public function formatDomain($domain)
{
$domain = str_replace("https:","http:",$domain);
preg_match("/^(http:\/\/)?([^\/]+)/i", $domain, $matches);
return $matches[2];
}
}