Angular 2如果路径不存在,如何重定向到404或其他路径[重复]

Posted

技术标签:

【中文标题】Angular 2如果路径不存在,如何重定向到404或其他路径[重复]【英文标题】:Angular 2 How to redirect to 404 or other path if the path does not exist [duplicate] 【发布时间】:2016-07-15 14:58:07 【问题描述】:

如果路径在 angular 2 中不存在,我试图重定向 404 / 其他路径

我尝试研究有一些方法可以用于角度 1 但不是角度 2。

这是我的代码:

@RouteConfig([

    path: '/news',
    name: 'HackerList',
    component: HackerListComponent,
    useAsDefault: true
,

    path: '/news/page/:page',
    name: 'TopStoriesPage',
    component: HackerListComponent
,

    path: '/comments/:id',
    name: 'CommentPage',
    component: HackerCommentComponent

])

例如,如果我重定向到/news/page/,那么它可以正常工作并返回一个空白页面,你如何处理这种情况?

【问题讨论】:

你用什么做路由? 我使用@RouteConfig 创建路由 【参考方案1】:

适用于 v2.2.2 及更新版本

在 v2.2.2 及更高版本中,name 属性不再存在,不应用于定义路由。应使用 path 代替 name,并且路径上不需要前导斜杠。在这种情况下使用path: '404' 而不是path: '/404'

 path: '404', component: NotFoundComponent,
 path: '**', redirectTo: '/404'

适用于 v2.2.2 之前的版本

你可以使用path: '/*path', redirectTo: ['redirectPathName']:

path: '/home/...', name: 'Home', component: HomeComponent
path: '/', redirectTo: ['Home'],
path: '/user/...', name: 'User', component: UserComponent,
path: '/404', name: 'NotFound', component: NotFoundComponent,

path: '/*path', redirectTo: ['NotFound']

如果没有路径匹配则重定向到NotFound路径

【讨论】:

我构建了一个角度测试项目,并在那里使用了这种技术。 /* 意味着任何东西。从 Angular Cheat Sheet Routing and Navigation 部分获得想法。 angular.io/docs/ts/latest/cheatsheet.html 但这仍然会返回状态 200。如何返回 404? 这似乎不再与嵌套路由结合使用。当您查看official documentation 时,您可以看到他们在开始时使用了该技术,但后来他们将其删除(不再提及) 如果,每个模块都包含自己的路由。 & 其中一个模块路由包含 path: '**', redirectTo: '/404' 然后接下来所有模块 url 模式从未调用它总是重定向到 /404。在匹配 ** 之前是否检查所有模块路由? @ShaishabRoy 为什么path: '404', component: NotFoundComponent, path: '**', redirectTo: '/404' IMO 这已经足够了: path: "**", component: NotFoundComponent 【参考方案2】:

随着 Angular 继续发布,我遇到了同样的问题。根据版本 2.1.0Route 界面如下所示:

export interface Route 
    path?: string;
    pathMatch?: string;
    component?: Type<any>;
    redirectTo?: string;
    outlet?: string;
    canActivate?: any[];
    canActivateChild?: any[];
    canDeactivate?: any[];
    canLoad?: any[];
    data?: Data;
    resolve?: ResolveData;
    children?: Route[];
    loadChildren?: LoadChildren;
 

所以我的解决方案如下:

const routes: Routes = [
     path: '', component: HomeComponent ,
     path: '404', component: NotFoundComponent ,
     path: '**', redirectTo: '404' 
];

【讨论】:

这适用于 Angular 5(类似于您的解决方案): const routes: Routes = [ path: 'home', component: HomeComponent , path: '', redirectTo: '/home' , pathMatch: 'full' , path: '404', component: NotfoundComponent , path: '**', redirectTo: '/404' ]; ** 应该是列表中的最后一条路线,.. @Lonely 你的评论应该是它自己的答案!它为我节省了数小时的工作时间和理智!!【参考方案3】:

我在 2.0.0 及更高版本上的首选选项是创建 404 路由并允许 ** 路由路径解析到相同的组件。这允许您记录和显示有关无效路由的更多信息,而不是可以隐藏错误的普通重定向。

简单的 404 示例:

 path '/', component: HomeComponent ,
// All your other routes should come first    
 path: '404', component: NotFoundComponent ,
 path: '**', component: NotFoundComponent 

要显示不正确的路由信息​​,请在 NotFoundComponent 中添加到路由器的导入:

import Router from '@angular/router';

将其添加到 NotFoundComponent 的构造函数中:

constructor(public router: Router)

然后你就可以从你的 HTML 模板中引用它了,例如

The page &lt;span style="font-style: italic"&gt;router.url&lt;/span&gt; was not found.

【讨论】:

当我尝试您的解决方案时,所有路由都重定向到 404。您的其他路由看起来像什么? 它不重定向,它加载NotFoundComponent,原始/无效路径仍然会在页面的URL中。 虽然这种方法看起来一样,但这种方法的主要好处是您保留了路由信息。根据其他答案的简单重定向会丢失上下文,因此您无法显示出了什么问题或提供超出通用“404”页面的日志记录。 @Ben,您需要在 404 路由之前提供其余的路由信息​​,因为 404 路由充当了一个失败。在示例路由的情况下,只有“/”路径有效。 这是正确的做法!为什么有人要在 404 的情况下重定向?如果是 404,我们只需要显示一个 404 组件并停留在那个无效的 url 上。另外,在重定向的情况下......如果我尝试导航到/invalid-path,然后被重定向到/404,那么如果我点击浏览器的“返回”按钮,那不会让我转到/invalid-path 和再次回到/404【参考方案4】:

正如 shaishab roy 所说,您可以在备忘单中找到答案。

但在他的回答中,给定的回应是:

path: '/home/...', name: 'Home', component: HomeComponent
path: '/', redirectTo: ['Home'],
path: '/user/...', name: 'User', component: UserComponent,
path: '/404', name: 'NotFound', component: NotFoundComponent,

path: '/*path', redirectTo: ['NotFound']

由于某些原因,它对我不起作用,所以我尝试了:

path: '/**', redirectTo: ['NotFound']

它有效。小心别忘了你需要把它放在最后,否则你会经常出现 404 错误页面;)。

【讨论】:

我认为你这边的原因不工作是因为我们当时仍处于测试阶段,他们确实在发布版本上进行了一些更改。顺便说一句,更新答案=D【参考方案5】:

确保,使用写在代码底部的这个 404 路由。

语法类似于


    path: 'page-not-found', 
    component: PagenotfoundComponent
,

    path: '**', 
    redirectTo: '/page-not-found'
,

谢谢

【讨论】:

以上是关于Angular 2如果路径不存在,如何重定向到404或其他路径[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2:在应用程序启动时重定向到页面

如何根据 Angular 2 中的条件重定向到某个路由。

Angular:如何在提交时重定向到另一个页面

如何使 Laravel 5 重定向到没有哈希(#)的 Angular 路由?

使用 Passport 进行社交身份验证登录后如何重定向到个人资料页面? (角度,快递,护照,jwt)

Strapi Microsoft 身份验证在 Angular 应用程序中存在重定向 URI 问题