Yii 用户友好 url 并保持旧的 get 格式正常工作
Yii User-friendly url and keep the old get format working
我为主配置设置了以下 url 规则:
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
'rules'=>array(
'<controller:\w+>'=>'<controller>/list',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
'<controller:\w+>/<id:\d+>/<title>'=>'<controller>/view',
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'\?r=<controller:\w+>/<action:\w+>' => '<controller>/<action>'
),
),
一切正常,但我也希望以前的 url 格式继续工作,这样我就不必重写很多我不关心的 url 格式搜索引擎优化友好:
index.php?r=controller/action¶m1=value1
但是现在显示错误。有没有办法让它继续工作?
我认为最好的方法是用 IDE 正则表达式替换选项替换所有旧网址。但无论如何你可以通过这种方式做你想做的事:
在 urlManager 配置中使用以下路由规则:
<code>'rules' => [
[
'class' => 'my\namespace\UrlRule',
'pattern' => '<controller>/<action>',
'route' => '<controller>/<action>',
],
...
用你的 my\namespace\UrlRule 扩展 yii\web\UrlRule 并重写它的 'parseRequest' 方法,这样它就可以使用 $_GET['r'] 参数值,如果是的话设置:
namespace my\namespace;
class UrlRule extends \yii\web\UrlRule
{
public function parseRequest($manager, $request)
{
if ($pathInfo = \Yii::$app->request->get('r')) {
\Yii::$app->request->setPathInfo($pathInfo);
}
return parent::parseRequest($manager, $request);
}
}
您也可以扩展 yii\web\Request,这样它的 'getPathInfo' 方法就可以使用 $_GET['r'] 参数(如果已设置)。
我为主配置设置了以下 url 规则:
'urlManager'=>array( 'urlFormat'=>'path', 'showScriptName'=>false, 'rules'=>array( '<controller:\w+>'=>'<controller>/list', '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', '<controller:\w+>/<id:\d+>/<title>'=>'<controller>/view', '<controller:\w+>/<id:\d+>'=>'<controller>/view', '\?r=<controller:\w+>/<action:\w+>' => '<controller>/<action>' ), ),
一切正常,但我也希望以前的 url 格式继续工作,这样我就不必重写很多我不关心的 url 格式搜索引擎优化友好:
index.php?r=controller/action¶m1=value1
但是现在显示错误。有没有办法让它继续工作?
我认为最好的方法是用 IDE 正则表达式替换选项替换所有旧网址。但无论如何你可以通过这种方式做你想做的事:
在 urlManager 配置中使用以下路由规则:
<code>'rules' => [ [ 'class' => 'my\namespace\UrlRule', 'pattern' => '<controller>/<action>', 'route' => '<controller>/<action>', ], ...
用你的 my\namespace\UrlRule 扩展 yii\web\UrlRule 并重写它的 'parseRequest' 方法,这样它就可以使用 $_GET['r'] 参数值,如果是的话设置:
namespace my\namespace; class UrlRule extends \yii\web\UrlRule { public function parseRequest($manager, $request) { if ($pathInfo = \Yii::$app->request->get('r')) { \Yii::$app->request->setPathInfo($pathInfo); } return parent::parseRequest($manager, $request); } }
您也可以扩展 yii\web\Request,这样它的 'getPathInfo' 方法就可以使用 $_GET['r'] 参数(如果已设置)。