Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 818|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-8-28 12:21:33 | 显示全部楼层 |阅读模式

    问题背景:

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

    use think\Route;
    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。。。更好

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 13:29 , Processed in 0.056219 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表