[top-think/think]路由:匹配规则是从前向后匹配,导致有些路由匹配不到

2023-12-15 448 views
6

路由文件:

Route::get('news', 'index/testController/test1');

Route::get('news_detail', 'index/testController/test2');

控制器

    public function test1()
    {
        echo 'new';
    }
    public function test2()
    {
        echo 'news_detail';
    }

当访问/news_detail的时候 会匹配到/new 的路由, 这使一个刚刚接触,没有仔细阅读文档的开发人员 十脸懵逼。。。

RuleItem.php第 248 行左右

if (0 === strcasecmp($rule, $url) || (!$completeMatch && 0 === strncasecmp($rule, $url, strlen($rule)))) { return $var; }

改成 if (0 === strcasecmp($rule, $url) || (!$completeMatch && rule == $url )) { return $var; } 后解决。

回答

8

你需要完整路由匹配

5

@liu21st 我知道在后面加一个$就好使了, 但是是不是对新手不太友好。。

4

@liu21st 因为一开始的时候路由可能是这样的 demo demo_db demo_sql 当匹配demo_db的时候执行却是demo 。

1

恩,使用完整匹配是可以,但有个问题:

`Route::group('blog', function(){

// Blog首页
Route::get('/$', 'blog/Index/index');

// Blog/ask (这里有点无语,不放前面会与 / 冲突)
Route::get('ask/$', 'blog/ask.Index/index');

Route::get('hello/<name>$', 'blog/Index/hello'); 

});`

访问 www.test.cn/public/blog 时是可以的,但访问 www.test.cn/public/blog/ 就不行了。 ask/ 的好控制,但blog时不好控制。

最终只能改成这样。 `// Blog首页 Route::get('blog/$', 'blog/Index/index');

Route::group('blog', function(){

// Blog/ask (这里有点无语,不放前面会与 / 冲突)
Route::get('ask/$', 'blog/ask.Index/index');

Route::get('hello/<name>$', 'blog/Index/hello'); 

});` 把首页的放在最前面了。

0

我改进了下

4

@oyvfhp 你的问题我也改进了

1

具体是怎么改进的?略讲解一下。

0

@oyvfhp 看提交记录就知道了