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]; } }