Example #1
0
 /**
  * 检测子域名部署
  * @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['*'];
             }
         }
     }
 }
Example #2
0
 /**
  * 检测子域名部署
  * @access public
  * @param Request   $request Request请求对象
  * @return void
  */
 public static function checkDomain($request)
 {
     // 域名规则
     $rules = self::$rules['domain'];
     // 开启子域名部署 支持二级和三级域名
     if (!empty($rules)) {
         $host = $request->host();
         if (isset($rules[$host])) {
             // 完整域名或者IP配置
             $rule = $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])) {
                     // 子域名配置
                     $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];
             }
         }
     }
 }