public static function checkDomain() { $rules = self::$domain; // 开启子域名部署 支持二级和三级域名 if (!empty($rules)) { if (isset($rules[$_SERVER['HTTP_HOST']])) { // 完整域名或者IP配置 $rule = $rules[$_SERVER['HTTP_HOST']]; } else { // 子域名配置 $domain = array_slice(explode('.', $_SERVER['HTTP_HOST']), 0, -2); if (!empty($domain)) { $subDomain = implode('.', $domain); $domain2 = array_pop($domain); // 二级域名 if ($domain) { // 存在三级域名 $domain3 = array_pop($domain); } if ($subDomain && isset($rules[$subDomain])) { // 子域名配置 $rule = $rules[$subDomain]; } elseif (isset($rules['*.' . $domain2]) && !empty($domain3)) { // 泛三级域名 $rule = $rules['*.' . $domain2]; $panDomain = $domain3; } elseif (isset($rules['*']) && !empty($domain2)) { // 泛二级域名 if ('www' != $domain2) { $rule = $rules['*']; $panDomain = $domain2; } } } } if (!empty($rule)) { // 子域名部署规则 // '子域名'=>'模块[/控制器/操作]' // '子域名'=>['模块[/控制器/操作]','var1=a&var2=b&var3=*']; if ($rule instanceof \Closure) { // 执行闭包 self::$bind = self::invokeRule($rule); return; } if (is_array($rule)) { $result = $rule[0]; if (isset($rule[1])) { // 传入参数 parse_str($rule[1], $parms); if (isset($panDomain)) { $pos = array_search('*', $parms); if (false !== $pos) { // 泛域名作为参数 $parms[$pos] = $panDomain; } } $_GET = array_merge($_GET, $parms); } } else { $result = $rule; } if (0 === strpos($result, '\\')) { // 绑定到类 self::$bind = ['class' => $result]; } elseif (0 === strpos($result, '[')) { // 绑定到分组 self::$bind = ['group' => substr($result, 1, -1)]; } else { // 绑定到模块/控制器 self::$bind = ['module' => explode('/', $result)]; } } } }
public static function checkDomain() { // 域名规则 $rules = self::$domain; // 开启子域名部署 支持二级和三级域名 if (!empty($rules)) { if (isset($rules[$_SERVER['HTTP_HOST']])) { // 完整域名或者IP配置 $rule = $rules[$_SERVER['HTTP_HOST']]; } else { $rootDomain = Config::get('url_domain_root'); if ($rootDomain) { // 配置域名根 例如 thinkphp.cn 163.com.cn 如果是国家级域名 com.cn net.cn 之类的域名需要配置 $domain = explode('.', rtrim(stristr($_SERVER['HTTP_HOST'], $rootDomain, true), '.')); } else { $domain = explode('.', $_SERVER['HTTP_HOST'], -2); } // 子域名配置 if (!empty($domain)) { // 当前子域名 $subDomain = implode('.', $domain); self::$subDomain = $subDomain; $domain2 = array_pop($domain); if ($domain) { // 存在三级域名 $domain3 = array_pop($domain); } if ($subDomain && isset($rules[$subDomain])) { // 子域名配置 $rule = $rules[$subDomain]; } elseif (isset($rules['*.' . $domain2]) && !empty($domain3)) { // 泛三级域名 $rule = $rules['*.' . $domain2]; $panDomain = $domain3; } elseif (isset($rules['*']) && !empty($domain2)) { // 泛二级域名 if ('www' != $domain2) { $rule = $rules['*']; $panDomain = $domain2; } } } } if (!empty($rule)) { // 子域名部署规则 if ($rule instanceof \Closure) { // 执行闭包 $reflect = new \ReflectionFunction($rule); self::$bind = $reflect->invokeArgs([]); return; } if (strpos($rule, '?')) { // 传入其它参数 $array = parse_url($rule); $result = $array['path']; parse_str($array['query'], $params); if (isset($panDomain)) { $pos = array_search('*', $params); if (false !== $pos) { // 泛域名作为参数 $params[$pos] = $panDomain; } } $_GET = array_merge($_GET, $params); } else { $result = $rule; } if (0 === strpos($result, '\\')) { // 绑定到命名空间 例如 \app\index\behavior self::$bind = ['type' => 'namespace', 'namespace' => $result]; } elseif (0 === strpos($result, '@')) { // 绑定到类 例如 \app\index\controller\User self::$bind = ['type' => 'class', 'class' => substr($result, 1)]; } elseif (0 === strpos($result, '[')) { // 绑定到分组 例如 [user] self::$bind = ['type' => 'group', 'group' => substr($result, 1, -1)]; } else { // 绑定到模块/控制器 例如 index/user self::$bind = ['type' => 'module', 'module' => $result]; } } } }
/** * 检测子域名部署 * @access public * @param Request $request Request请求对象 * @param array $currentRules 当前路由规则 * @param string $method 请求类型 * @return void */ public static function checkDomain($request, &$currentRules, $method = 'get') { // 域名规则 $rules = self::$rules['domain']; // 开启子域名部署 支持二级和三级域名 if (!empty($rules)) { $host = $request->host(); if (isset($rules[$host])) { // 完整域名或者IP配置 $item = $rules[$host]; } else { $rootDomain = Config::get('url_domain_root'); if ($rootDomain) { // 配置域名根 例如 thinkphp.cn 163.com.cn 如果是国家级域名 com.cn net.cn 之类的域名需要配置 $domain = explode('.', rtrim(stristr($host, $rootDomain, true), '.')); } else { $domain = explode('.', $host, -2); } // 子域名配置 if (!empty($domain)) { // 当前子域名 $subDomain = implode('.', $domain); self::$subDomain = $subDomain; $domain2 = array_pop($domain); if ($domain) { // 存在三级域名 $domain3 = array_pop($domain); } if ($subDomain && isset($rules[$subDomain])) { // 子域名配置 $item = $rules[$subDomain]; } elseif (isset($rules['*.' . $domain2]) && !empty($domain3)) { // 泛三级域名 $item = $rules['*.' . $domain2]; $panDomain = $domain3; } elseif (isset($rules['*']) && !empty($domain2)) { // 泛二级域名 if ('www' != $domain2) { $item = $rules['*']; $panDomain = $domain2; } } } } if (!empty($item)) { if (isset($item['[bind]'])) { // 解析子域名部署规则 list($rule, $option, $pattern) = $item['[bind]']; if (!empty($option['https']) && !$request->isSsl()) { // https检测 throw new HttpException(404, 'must use https request:' . $host); } if (strpos($rule, '?')) { // 传入其它参数 $array = parse_url($rule); $result = $array['path']; parse_str($array['query'], $params); if (isset($panDomain)) { $pos = array_search('*', $params); if (false !== $pos) { // 泛域名作为参数 $params[$pos] = $panDomain; } } $_GET = array_merge($_GET, $params); } else { $result = $rule; } if (0 === strpos($result, '\\')) { // 绑定到命名空间 例如 \app\index\behavior self::$bind = ['type' => 'namespace', 'namespace' => $result]; } elseif (0 === strpos($result, '@')) { // 绑定到类 例如 @app\index\controller\User self::$bind = ['type' => 'class', 'class' => substr($result, 1)]; } else { // 绑定到模块/控制器 例如 index/user self::$bind = ['type' => 'module', 'module' => $result]; } self::$domainBind = true; } else { self::$domainRule = $item; $currentRules = isset($item[$method]) ? $item[$method] : $item['*']; } } } }