• thinkphp 二级域名绑定模块,导致设置的路由被多域名共用的问题解决方案


    问题背景:

    在router.php路由配置文件设置了二级域名和路由设置

    use thinkRoute;
    Route::domain('www','index');
    Route::domain('admin','admin');
    Route::domain('m','m');
    
    Route::rule('show/:id','index/Article/item');
    Route::rule('about_us','index/index/about_us');

    遇到的问题:

    访问 www.t.com/about_us 会访问  index/index/about_us 即index模块index控制器的about_us方法;

    但是 访问 admin.t.com/about_us 也会访问  index/index/about_us ;这显然是我们不想看到的

    解决思路:

    能不能在Route的rule()中做一个判断?如果当前域名是绑定了admin模块的,但是设置的路由地址(即:index/index/about_us) 的模块不是admin模块,那么就忽略该路由设置

    修改源码:

        /**
         * 注册路由规则
         * @access public
         * @param string|array $rule    路由规则
         * @param string       $route   路由地址
         * @param string       $type    请求类型
         * @param array        $option  路由参数
         * @param array        $pattern 变量规则
         * @return void
         */
        public static function rule($rule, $route = '', $type = '*', $option = [], $pattern = [])
        {
            $r_data = explode('/',$route);
            $host_data = explode('.',$_SERVER ['HTTP_HOST']);
            if(count($r_data) == 3 && count($host_data) == 3){
                $erji_host = $host_data[0];
                if(isset(self::$rules['domain'][$erji_host])){
                    if(self::$rules['domain'][$erji_host]['[bind]'][0] != $r_data[0]){
                        return false;
                    }
                }
            }
            $group = self::getGroup('name');
    
            if (!is_null($group)) {
                // 路由分组
                $option  = array_merge(self::getGroup('option'), $option);
                $pattern = array_merge(self::getGroup('pattern'), $pattern);
            }
    
            $type = strtolower($type);
    
            if (strpos($type, '|')) {
                $option['method'] = $type;
                $type             = '*';
            }
            if (is_array($rule) && empty($route)) {
                foreach ($rule as $key => $val) {
                    if (is_numeric($key)) {
                        $key = array_shift($val);
                    }
                    if (is_array($val)) {
                        $route    = $val[0];
                        $option1  = array_merge($option, $val[1]);
                        $pattern1 = array_merge($pattern, isset($val[2]) ? $val[2] : []);
                    } else {
                        $option1  = null;
                        $pattern1 = null;
                        $route    = $val;
                    }
                    self::setRule($key, $route, $type, !is_null($option1) ? $option1 : $option, !is_null($pattern1) ? $pattern1 : $pattern, $group);
                }
            } else {
                self::setRule($rule, $route, $type, $option, $pattern, $group);
            }
    
        }

    2019 11-13 07点36分:此方法并不好,在Route里面,判断前缀是m,index还是admin,然后在判断里面设置Route::set。。。更好

  • 相关阅读:
    Angularjs-Forms(表单)
    Angularjs-filter(过滤器)
    Angularjs –– Expressions(表达式)
    Angular
    AngularJS
    AngularJS–Scope(作用域)
    AngularJS–service(服务)
    AngularJS--控制器(Controller)
    AngularJS指南文档
    Web 开发模式演变历史和趋势
  • 原文地址:https://www.cnblogs.com/cl94/p/11745817.html
Copyright © 2020-2023  润新知