我使用catchAll
路由到我的配置
'catchAll' => ['site/page']
它工作正常。
但是所有请求都会执行此操作,即使是那个具有单独控制器/操作的操作。
如何首先映射路由以匹配控制器/操作,如果相应的控制器/操作不存在,那么回退以捕获所有路由?
答案 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]);
}
}