• “女军官”骗婚骗财记:多重角色扮演 自己也入了戏 2020-01-12
  • 21岁CEO为留学生做“安保” 2020-01-12
  • 赌王四太家的豪宅曝光,网友:一点都不羡慕 ——凤凰网房产 2020-01-08
  • 回复@老老保老张工:吃个早餐还要让人批准?就这点出息啊? 2020-01-06
  • 中共上海十届市委六次全会召开 2019-12-29
  • 百名红色通缉令三成多归案 海外追逃难在何处? 2019-12-29
  • 在粪坑里优胜的是蛆虫,在不公正的社会里优胜的是蛀虫。 2019-12-19
  • 佛山成功孵化高校科技成果项目 2019-12-19
  • 笑博士,你说说,过去的国民经济发展计划是怎么订立的?有什么样的组织架构具体运作和实现这个事情?笑博士没有那个时代的经历,抄书、抄资料,说成绩、说缺点,都是可以的 2019-12-08
  • 如何制作、存储腌腊肉?闻着有“哈喇味”就千万别吃了 2019-12-08
  • 性格能预测寿命?4种性格有助长寿 2019-11-27
  • 独家|国际博物馆日专访单霁翔:看院长为自己打多少分 2019-11-27
  • 人民网驻印尼记者报道集 2019-11-25
  • 武磊又丢单刀+空门不进 球迷:外战外行的杰作! 2019-11-25
  • 拉萨市海拔4300米以下再无“无树村 无树户” 2019-11-15
  • tp5.1.38路由生成代码有bug

    浏览:1024 发布日期:2019/11/12
    5.0.0 - 严重 - 已关闭
    使用url('index/News/list',['group_name'=>'aaa','page'=>1]);时发现问题
    route.php 填写2下面2个路由 Route::rule('news/<group_name>/p-<page>', 'index/News/list');
     Route::rule('news/<group_name>', 'index/News/list');
    当参数只传group_name的时候,匹配后的路由为:
    www.test.com/aaa/p-<page>,原应该是:www.test.com/aaa
    如果上面路由顺序颠倒下,传2个参数的时候,生成的路由为:
    www.test.com/aaa/page/1,原应该是:www.test.com/aaa/p-1
    后来检查代码,是路由解析代码有bug;
    代码地址 thinkphp/library/think/Url.php:349  // 匹配路由地址
        public function getRuleUrl($rule, &$vars = [], $allowDomain = '')
        {
            foreach ($rule as $item) {
                list($url, $pattern, $domain, $suffix, $method) = $item;

                if (is_string($allowDomain) && $domain != $allowDomain) {
                    continue;
                }

                if (!in_array($this->app['request']->port(), [80, 443])) {
                    $domain .= ':' . $this->app['request']->port();
                }

                if (empty($pattern)) {
                    return [rtrim($url, '?/-'), $domain, $suffix];
                }

                $type = $this->config['url_common_param'];

                foreach ($pattern as $key => $val) {
                    if (isset($vars[$key])) {
                        $url = str_replace(['[:' . $key . ']', '<' . $key . '?>', ':' . $key, '<' . $key . '>'], $type ? $vars[$key] : urlencode($vars[$key]), $url);
                        unset($vars[$key]);//原值被unset,外部foreach拿不到原值
                        $url    = str_replace(['/?', '-?'], ['/', '-'], $url);
                        $result = [rtrim($url, '?/-'), $domain, $suffix];
                    } elseif (2 == $val) {
                        $url    = str_replace(['/[:' . $key . ']', '[:' . $key . ']', '<' . $key . '?>'], '', $url);
                        $url    = str_replace(['/?', '-?'], ['/', '-'], $url);
                        $result = [rtrim($url, '?/-'), $domain, $suffix];
                    } else {
                        //未清空$result
                        break;
                    }
                }

                if (isset($result)) {
                    return $result;
                }
            }

            return false;
        }
    问题处在内循环的foreach,
    问题一:第一个变量匹配成功后,第二个变量匹配失败,在最后的break;之前没有清空$result,出了内循环后会被return,
    问题二:$vars在内循环第一个参数被匹配到后参数时被清除,第二参数匹配失败,到外循环foreach时,参数$vars拿不到原始的参数,在之前的内循环中被unset()了
    评论(
    后面还有条评论,点击查看>>
  • “女军官”骗婚骗财记:多重角色扮演 自己也入了戏 2020-01-12
  • 21岁CEO为留学生做“安保” 2020-01-12
  • 赌王四太家的豪宅曝光,网友:一点都不羡慕 ——凤凰网房产 2020-01-08
  • 回复@老老保老张工:吃个早餐还要让人批准?就这点出息啊? 2020-01-06
  • 中共上海十届市委六次全会召开 2019-12-29
  • 百名红色通缉令三成多归案 海外追逃难在何处? 2019-12-29
  • 在粪坑里优胜的是蛆虫,在不公正的社会里优胜的是蛀虫。 2019-12-19
  • 佛山成功孵化高校科技成果项目 2019-12-19
  • 笑博士,你说说,过去的国民经济发展计划是怎么订立的?有什么样的组织架构具体运作和实现这个事情?笑博士没有那个时代的经历,抄书、抄资料,说成绩、说缺点,都是可以的 2019-12-08
  • 如何制作、存储腌腊肉?闻着有“哈喇味”就千万别吃了 2019-12-08
  • 性格能预测寿命?4种性格有助长寿 2019-11-27
  • 独家|国际博物馆日专访单霁翔:看院长为自己打多少分 2019-11-27
  • 人民网驻印尼记者报道集 2019-11-25
  • 武磊又丢单刀+空门不进 球迷:外战外行的杰作! 2019-11-25
  • 拉萨市海拔4300米以下再无“无树村 无树户” 2019-11-15
  • 新疆11选5中奖条件 奥运会网球比分规则 广西快三 怎么把国内视频搬运到国外赚钱 中国福利22选5开奖 36棋牌游戏下载 陕西十一选五下载 54hk赛马会cc免费资料 3D 大富豪彩票网址