我想对urlManager使用一个catch-all规则,它会将我的基本url之后的任何内容传递给默认控制器和方法作为参数。
我的目标是将mysite.com/123
等网址映射到mysite.com/controller/method/123
,其中控制器/方法已预先确定,123
作为命名参数传递。
这样的规则将最后放在urlManager链中,这样如果其他规则都不匹配,它会将基本网址之后的任何内容传递给我选择的控制器/方法。
任何想法??
修改
添加规则'<id>'=>'controller/method'
(我认为我无论如何都尝试过)然后查看site.com/123将返回404未找到,但是来自 apache ,而不是Yii。我没有考虑的事情。
转到mysite.com/index.php/123
得到了理想的结果。转到mysite.com/controller/method
虽然会正确地路由网址。奇怪...
答案 0 :(得分:0)
是的,您必须将此作为所有其他规则下的最后一条规则。
'<id>' => 'controllerName/methodName/<id>,'
示例:
'<id>' => 'user/view/<id>',
这将重定向所有网址,如下所示:
mysite.com/1
致:
mysite.com/user/view/1
如果您只想限制数字,请使用
'<id:\d+>' => 'controllerName/methodName/<id>,'
答案 1 :(得分:0)
您应该将此规则添加到网址规则的底部:
'urlManager'=>array(
'urlFormat'=>'path',
'rules'=>array(
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
'<pname:\w+>'=>'site/test',
),
),
Pname:您的命名参数。 站点/测试:目标行动。
在您的操作中,您应将“pname”定义为方法参数:
public function actionTest($pname) { echo "Name:$pname"; }