Yii2后端NotFound页面正常前端失效 URL追加参数不返回404问题
问题根因
- UrlManager配置错误:一是
enablePrettyUrl设为false,但实际使用的是美化URL格式,配置逻辑不匹配;二是yii\web\UrlNormalizer的配置错误放在了rules数组内,本应为urlManager的直接子配置项,导致路径归一化规则完全不生效,多余的路径后缀无法被识别为异常路径。 - 路由规则未适配实际URL结构:现有路由规则只匹配
控制器/id、控制器/动作/id这类基础格式,没有适配你当前/products/[商品ID]/[商品slug]的URL结构,路由解析时只要匹配到ID参数就会命中products/view动作,不会校验后续路径段的合法性。 - 控制器逻辑未做合法性校验:
ProductsController的view动作只根据ID参数查询商品,没有校验URL中携带的商品slug是否与数据库存储的slug完全一致,只要ID存在就返回商品页,不会抛出404异常。
修复方案
1. 修正urlManager配置
把UrlNormalizer移出rules数组,开启美化URL,补充精准路由规则,修改后的urlManager配置如下:
'urlManager' => [ 'baseUrl' => '', 'enablePrettyUrl' => true, // 开启美化URL,匹配实际使用的路径格式 'showScriptName' => false, 'enableStrictParsing' => true, // UrlNormalizer移为urlManager直接子配置,路径不匹配直接抛404 'normalizer' => [ 'class' => 'yii\web\UrlNormalizer', 'collapseSlashes' => true, 'normalizeTrailingSlash' => true, 'action' => yii\web\UrlNormalizer::ACTION_NOT_FOUND, ], 'rules'=>[ // 补充商品页精准路由,限定参数格式,多余路径不会命中该规则 'products/<id:\d+>/<slug:[\w\-]+>' => 'products/view', '<controller:\w+>/<id:\d+>' => '<controller>/view', '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', '<controller:\w+>/<action:\w+>' => '<controller>/<action>', ], ],
2. 给商品详情动作补充slug校验
在ProductsController的actionView方法中新增slug匹配校验,不匹配直接抛404:
public function actionView($id, $slug = '') { $product = Product::findOne($id); if (!$product) { throw new yii\web\NotFoundHttpException('请求的商品不存在'); } // 校验URL中的slug与数据库存储的是否一致,也可根据需求调整为301跳转到正确URL if ($product->slug !== $slug) { throw new yii\web\NotFoundHttpException('页面不存在'); } // 原有业务逻辑 return $this->render('view', [ 'product' => $product, ]); }
3. 验证404页生效
确认SiteController中存在默认的actionError方法,测试非法路径即可正常加载error.php404视图。
内容的提问来源于stack exchange,提问作者Tim Benton
相关产品推荐
相关产品推荐

