Yii2中yii\web\UrlManager无法生成友好URL,求排查问题
问题分析与解决方案
嘿,我帮你找到了问题的根源,主要是URL规则里的正则表达式写法出错了,还有个小细节可以优化,下面具体说:
1. 正则表达式的连字符用错了
你规则里写的<id:[\\w-_]+>有个坑:在正则的字符类[]里,连字符-如果夹在两个字符中间,会被当成范围运算符(比如a-z表示从a到z的所有字母),而不是普通的连字符。\w-_这个写法会被解析成一个无效的范围(因为_的ASCII码比字母高),导致这个正则根本匹配不到about、contact这类你的id参数值,所以UrlManager没法触发这个规则,只能退而求其次生成带?id=xxx的URL。
怎么改?
把连字符放到字符类的开头或者结尾,或者给它转义就行,修正后的规则如下:
return [ 'class' => \yii\web\UrlManager::class, 'enablePrettyUrl' => true, 'showScriptName' => false, 'baseUrl' => '', 'rules' => [ // 方案1:把-放在字符类末尾,最直观 'page/<id:[\\w_-]+>' => 'page/index', // 或者方案2:给-转义,也能生效 // 'page/<id:[\\w\\-_]+>' => 'page/index', ], ];
2. 路由调用的小优化
你生成URL时用的['/page']虽然功能上没问题,但更规范的写法是明确指定控制器和动作:['page/index'],这样不仅更清晰,还能避免一些路由解析的潜在问题。修正后的代码:
$menuItems = [ [ 'label' => 'Home', 'url' => Yii::$app->urlManager->createAbsoluteUrl(['page/index']), ], [ 'label' => 'About', 'url' => Yii::$app->urlManager->createAbsoluteUrl(['page/index', 'id' => 'about']), ], [ 'label' => 'Contact', 'url' => Yii::$app->urlManager->createAbsoluteUrl(['page/index', 'id' => 'contact']), ], ];
改完后的效果
修正之后,生成的URL应该就变成你想要的友好格式了:
http://localhost/page/abouthttp://localhost/page/contact
另外提一句,从你现在能生成http://localhost/page?id=about来看,服务器的rewrite配置(比如Apache的mod_rewrite或者Nginx的规则)应该是没问题的,不用额外调整~
内容的提问来源于stack exchange,提问作者Mik
相关产品推荐
相关产品推荐

