请选择 进入手机版 | 继续访问电脑版

SpeedPHP框架

 找回密码
 注册成为新用户

QQ登录

只需一步,快速开始

查看: 527|回复: 1

关于路由部分代码问题

[复制链接]
发表于 2019-6-8 22:26:23 | 显示全部楼层 |阅读模式
路由配置如下config = array(
        'rewrite' => array(
            '<m>/<c>/<a>' => '<m>/<c>/<a>',
                '/' => '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-6-9 14:55:08 | 显示全部楼层
看不是很懂上面的意思?

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

另外,代码欢迎用git pull request,大家多交流
您需要登录后才可以回帖 登录 | 注册成为新用户

本版积分规则

手机浏览|简版|中文PHP框架|开源协议|SpeedPHP.com ( 粤ICP备08008671号

GMT+8, 2019-12-16 08:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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