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&param1=value1

但是现在显示错误。有没有办法让它继续工作?

我认为最好的方法是用 IDE 正则表达式替换选项替换所有旧网址。但无论如何你可以通过这种方式做你想做的事:

  1. 在 urlManager 配置中使用以下路由规则: <code>'rules' => [ [ 'class' => 'my\namespace\UrlRule', 'pattern' => '<controller>/<action>', 'route' => '<controller>/<action>', ], ...

  2. 用你的 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'] 参数(如果已设置)。