将所有请求(不与其他路由匹配)路由到单个操作

时间:2014-10-28 09:35:03

标签: yii2

我使用catchAll路由到我的配置

'catchAll' => ['site/page']

它工作正常。

但是所有请求都会执行此操作,即使是那个具有单独控制器/操作的操作。

如何首先映射路由以匹配控制器/操作,如果相应的控制器/操作不存在,那么回退以捕获所有路由?

2 个答案:

答案 0 :(得分:9)

此配置可以满足您的需求:

'urlManager' => [
    'class' => 'yii\web\UrlManager',
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'contact' => 'site/contact',
        '/' => 'page/view',
------> HERE
        '/<url:[a-zA-Z0-9-]+>' => 'site/page',
    ],
],

您应该修改规则以捕获更多字符。我用过这个,因为我知道我的路线。

当您想要将网站置于维护模式时,应使用catchAll。在这种情况下也可以使用错误捕获。

答案 1 :(得分:1)

这正是catchAll属性的意图:

  

设置catchAll属性后,它将替换从传入请求中解析的所有路由。使用上述配置,将使用相同的站点/脱机操作来处理所有传入的请求。

实现您想要的最简单方法是利用内置的错误处理。如果您正在使用errorHandler,就像在示例应用程序中定义的那样,每次遇到错误(例如不存在的路由)时都会触发site/error操作。

在此操作中,您可以使用异常类型以特定方式处理404错误,例如:

public function actionError()
{
    $exception = Yii::$app->errorHandler->exception;

    if ($exception instanceof \yii\web\NotFoundHttpException) {
        // all non existing controllers+actions will end up here
    } else {
        return $this->render('error', ['exception' => $exception]);
    }
}