tp5.1.38路由生成代碼有bug

瀏覽:862 發布日期: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()了
評論(
后面還有條評論,點擊查看>>
天津快乐十分开奖结果