发现3.1.2版本的URL路由BUG

浏览:743 发布日期:2013/11/21 分类:技术分享 关键字: ThinkPHP URL路由规则
我的路由规则如下:

'URL_ROUTE_RULES' => array(
'photo/:id\d' => 'Photo/showPhoto',
'photo' => 'Photo/showLobby',
);

请求地址是
http:/xx/Photo/addReply
理想状态下没有定义 Photo/addReply 的规则,所以不应该匹配才对,但是却匹配了上面的第2条伪静态规则,我看了框架代码,发现CheckRouteBehavior这个行为类里面的checkUrlMatch方法中 elseif(0 !== strcasecmp($val,$m1[$key])) 这个逻辑节点将$val (我伪静态第2条规则里的photo键名) 与 $m1[$key] (URL里描述MODULE部分的Photo) 进行了不区分大小写的比较,于是匹配,就认为路由成功,于是就匹配了伪静态规则里的第2条规则
其实我的URL描述是为了调用 Photo控制器的addReply方法,针对此问题我在CheckRouteBehavior控制器的 elseif(0 !== strcasecmp($val,$m1[$key])) 后面增加了一个逻辑节点,代码如下:
elseif($rule != $regx && strpos($rule, ':') === false){
//如果规则与URL参数不全等,并且规则里没有描述变量的话则认为是匹配不成功,这样就跳过了所有不符合的伪静态规则,回到正常的默认路由中找控制器和方法了
$match = false;
break;
}

我初步思考了一下暂时认为这样可行,希望资深人士一起探讨一下,如果官方确认了该BUG希望尽快在未来版本中修正哦,下面贴上我修改后的整个CheckRouteBehavior控制器的checkUrlMatch方法

private function checkUrlMatch($regx,$rule) {
$m1 = explode('/',$regx);
$m2 = explode('/',$rule);
$match = true; // 是否匹配
foreach ($m2 as $key=>$val){
if(':' == substr($val,0,1)) {// 动态变量
if(strpos($val,'\\')) {
$type = substr($val,-1);
if('d'==$type && !is_numeric($m1[$key])) {
$match = false;
break;
}
}elseif(strpos($val,'^')){
$array = explode('|',substr(strstr($val,'^'),1));
if(in_array($m1[$key],$array)) {
$match = false;
break;
}
}
}elseif(0 !== strcasecmp($val,$m1[$key])){
$match = false;
break;
}elseif($rule != $regx && strpos($rule, ':') === false){
$match = false;
break;
}
}
return $match;
}
最佳答案
评论( 相关
后面还有条评论,点击查看>>