Yii urlManager如何配置规则将指定带参URL映射到目标控制器动作
路由不生效的核心原因
混淆了路径匹配范围和查询字符串的边界:Yii urlManager的路由规则匹配对象,是URL中?之前的pathinfo部分,?后面的GET参数根本不属于路径匹配的扫描范围。
之前写的规则里,把?param1=xxx¶m2=xxx整段写到了左边的匹配串里,相当于要求pathinfo里就必须包含这堆带问号的字符,但实际浏览器请求的pathinfo只有tractor-unit/,问号后面的内容是独立的查询串,根本不在路径匹配范围内,自然永远匹配不上。
可直接落地的正确配置
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ // 仅匹配路径部分即可,查询参数会被自动解析传递 'tractor-unit/' => 'tractor/do', ] ],
配置生效逻辑:
- 访问
http://localhost:5555/tractor-unit/?param1=1¶m2=abc时,urlManager会把提取到的pathinfotractor-unit/映射到tractor/do动作 - 后面携带的
param1=1¶m2=abc是标准GET请求参数,会自动被请求组件解析,既可以在控制器方法里直接用动作参数接收,也可以通过Yii::$app->request->get('param1')获取,完全不需要在路由规则里额外声明。
易混淆的边界说明
只有当参数是写在路径里的时候(比如http://localhost:5555/tractor-unit/1/abc这种形式),才需要把参数占位符写到路由的匹配串里,对应的规则写法类似'tractor-unit/<param1:\d+>/<param2:\w+>' => 'tractor/do'。如果参数是放在?后面的标准查询串,完全不需要在路由规则里做任何声明。
如果需要在路由层对GET参数做格式强制校验(比如要求param1必须是数字、param2必须是字母数字组合),最易维护的方式是直接在tractor控制器的do动作方法里做入参校验,不需要强行把校验逻辑塞进路径匹配规则。
配置后排查清单
- 确认web服务器的伪静态规则配置正确,支持把所有非静态文件请求转发到入口脚本
index.php,否则prettyUrl模式下根本无法解析到正确的pathinfo - 清理runtime目录下的路由缓存文件,避免旧规则缓存覆盖新配置
内容的提问来源于stack exchange,提问作者idunno
相关产品推荐
相关产品推荐

