Angular 5两次路由重定向异常:根路由未跳转至指定子路由
首先,咱们来定位你遇到的核心问题:根路由的/本该重定向到/posts,再由Posts模块重定向到/posts/view,但实际却跳转到了/albums/view,这大概率是两个配置细节出错导致的:
1. 子模块路由被错误注册为根路由
如果你的AppModule里直接导入了某个子模块(比如AlbumsModule),而不是仅通过懒加载的loadChildren配置,那这个子模块的路由会被合并到根路由中。此时,子模块里的path: ''路由会和根路由的path: ''重定向路由竞争匹配优先级。
举个例子:要是AppModule先导入AlbumsModule,再导入MainRoutesModule,Angular会优先匹配AlbumsRoutes里的path: ''路由,直接触发重定向到/albums/view,完全绕过了根路由的重定向规则。
修复方案:
- 检查
AppModule的imports数组,确保所有子模块(AlbumsModule、PostsModule等)都没有被直接导入,只保留MainRoutesModule的导入; - 子模块的路由仅通过
loadChildren在根路由中配置,确保懒加载逻辑生效。
2. 子模块路由使用了绝对路径重定向
你的子模块路由里写了:
{path: '', redirectTo: '/albums/view', pathMatch: 'full'},
这里的/albums/view是绝对路径,虽然能实现跳转,但违背了懒加载路由的相对挂载设计。更关键的是,如果子模块被错误加载,绝对路径会强制跳转到固定URL,加重路由混乱。
修复方案:
把子模块的重定向改为相对路径,因为子模块的路由是挂载在对应父路径(比如/albums)下的,path: ''对应的就是父路径本身,所以只需重定向到'view'即可:
修改AlbumsRoutes.ts:
const routes: Routes = [ {path: '', redirectTo: 'view', pathMatch: 'full'}, // 使用相对路径 {path: 'view', component: ViewComponent} ];
同理,PostsRoutes.ts、TodosRoutes.ts等都做相同修改,把redirectTo的值改为'view'就好。
3. 确认根路由配置的正确性
你的根路由配置本身逻辑是对的,再确认下顺序没问题就行:
const routes: Routes = [ // 优先匹配根路径,重定向到/posts {path: '', redirectTo: '/posts', pathMatch: 'full'}, // 父路由,承载所有懒加载子模块 { path: '', component: MainComponent, children: [ {path: 'albums', loadChildren: 'app/Albums/Albums#AlbumsModule'}, {path: 'todos', loadChildren: 'app/Todos/Todos#TodosModule'}, {path: 'posts', loadChildren: 'app/Posts/Posts#PostsModule'}, {path: 'users', loadChildren: 'app/Users/Users#UsersModule'} ] }, // 404路由 {path: '**', component: NotFoundComponent} ];
这个顺序是正确的:根路径的重定向路由排在最前面,确保访问/时优先触发重定向到/posts,然后加载PostsModule,再由PostsModule的路由重定向到/posts/view。
验证步骤
- 移除
AppModule中所有直接导入的子模块; - 把所有子模块的路由重定向改为相对路径;
- 重启应用,访问
/,应该会依次跳转到/posts->/posts/view,完全符合预期。
内容的提问来源于stack exchange,提问作者user1031569

