关于路由部分代码问题

#1 gxnnhuzz

路由配置如下:$config = array(
        'rewrite' => array(
            '//' => '//',
                '/' => 'api/main/index',
        ),
);


当访问
http://localhost时,报错没有找到MainController,可事实上MainController是存在的,actionIndex也存在,经跟踪后发现,speed.php第21行起的路由计算后发现:当$rule==/时,28行if(preg_match($rule, $GLOBALS['http_scheme'].$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $matchs)) 的$rule为http://locallhost//$,这个preg_match不成立,下面的自动生成m c a 的代码被跳过,导致找不到MainController,后来经过如下修改,初步解决这个问题,但希望jake检查一下以下代码会不会引发其它问题:

if('/' == $rule)
        $rule = '/$';

if(0!==stripos($rule, $GLOBALS['http_scheme'])){
        $url = $GLOBALS['http_scheme'].$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/\\') ;
        if (preg_match("/\\/+$/",$url))
                $rule =  $url.$rule;
        else{
                if (preg_match("/^\\/+/",$rule)){
                        $rule =  $url.$rule;
                }else{
                        $rule =  $url.'/'.$rule;
                }
        }

}

$rule = '/'.str_ireplace(array('\\\\', $GLOBALS['http_scheme'], '/', '<', '>',  '.'),
        array('', '', '\/', '(?P<', '>[-\w]+)', '\.'), $rule).'/i';

$testuri = $GLOBALS['http_scheme'].$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] ;
$testuri = preg_replace("/\\/+$/","/",$testuri) ;

2019-06-08 22:26:23

#2 jake

看不是很懂上面的意思?

我觉得,按楼上的配置,如果访问http://localhost,应该是命中第一条配置的。之前手册里面的规则是越大范围匹配的应该越在后面。

另外,代码欢迎用git pull request,大家多交流:handshake

2019-06-09 14:55:08