Vue前端配置路由通配捕获 404

Vue前端配置路由通配捕获 404

重点:你的项目使用动态路由 addRoute 加载菜单,通配 404 不能写在 constantRoutes 数组里面,写进去会出现:登录后跳转直接 404 的经典 bug。

① 修改 src/router/index.js

复制代码
import { createRouter, createWebHistory } from 'vue-router'

// 常量路由,所有人都能访问
export const constantRoutes = [
  {
    path: '/',
    redirect: '/login'
  },
  {
    path: '/login',
    component: () => import('@/views/login/index.vue')
  },
  {
    path: '/404',
    component: () => import('@/views/error/404.vue')
  },
  {
    path: '/500',
    component: () => import('@/views/error/500.vue')
  }
]

// 异步路由,权限菜单,后续addRoute动态添加
export const asyncRoutes = [
  // dashboard、用户管理等业务路由
]

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: constantRoutes
})

// ⚠️ 删掉这里!不要在这里写  path:'/:pathMatch(.*)*'

export default router

② 在获取权限、循环 addRoute 动态路由完成之后,追加 404 通配路由

一般写在 pinia userStore,登录成功,拿到后端返回菜单,处理完 asyncRoutes 循环 addRoute 之后。

示例代码(user store 内部)

复制代码
// 1. 拿到后端菜单,生成路由数组
const accessRoutes = generateRoutes(menus)

// 2.循环添加业务动态路由
accessRoutes.forEach(route => {
  router.addRoute(route)
})

// ✅【关键】所有动态路由添加完毕,**最后一步**追加404捕获路由
router.addRoute({
  path: '/:pathMatch(.*)*',
  redirect: '/404'
})

逻辑顺序一定要记牢

  1. 登录成功
  2. 请求后端获取用户菜单权限
  3. 把菜单转换成 vue 路由对象
  4. 循环 router.addRoute() 添加业务页面路由
  5. 最后执行 addRoute 添加 /:pathMatch(.*)* 通配 404

如果顺序颠倒,动态路由还没注册,访问页面直接命中 404 通配,直接跳 404,页面白屏。

测试验证

  1. 登录系统,进入首页
  2. 浏览器地址栏手动输入一个不存在路径,例如:http://localhost:5173/aaaa1234
  3. 自动跳转到 /404,渲染你的 ErrorView 组件页面。

重要补充(history 模式打包上线)

打包后部署 nginx,history 模式必须配置,否则刷新页面服务器返回 404

复制代码
location / {
  try_files $uri $uri/ /index.html;
}

本地 vite 开发环境不需要配置 nginx。


现在我们的路由完整流程

  1. /login 登录页面
  2. 登录成功,获取菜单,addRoute 加载动态业务路由
  3. addRoute 追加 404 通配
  4. 访问不存在地址自动跳转 /404
相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A1 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
honkun61 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net