如何从有角的PageNotFoundComponent返回状态代码404?

twk*_*twk 7 angular2-routing angular

我的理解是,可以通过设置{ path: '**', component: PageNotFoundComponent }为RouterMoudle.forRoot(routes)来自定义“未找到”页面。

但是,它返回http状态代码200。如何返回状态代码404?

n00*_*dl3 10

实际上,它不会返回任何状态,该页面应该与您的应用捆绑在一起,因此您不会获得任何状态,因为没有请求。

发送404状态毫无意义,因为当您在角度应用程序(因为它是单页应用程序)中更改页面时,没有真正的请求。

即使您的404页面位于延迟加载的模块中,您也必须获得200状态,因为捆绑包已正确加载。另外,您不能在客户端更改请求的状态。

如果使用服务器端渲染(使用角度通用),则服务器可能能够在页面加载时发送404状态,但是当用户浏览器从一个页面切换到另一个页面时,状态将不会发送。


asi*_*hmi 7

您问题的简单答案是“是”和“否”

这取决于你的场景。有两种类型的 Angular 应用程序。

客户端(在这种情况下不可能)

一个普通的 Angular 应用程序在浏览器中执行,在 DOM 中渲染页面以响应用户操作

这些应用程序采用整个应用程序或其中的一部分(使用延迟加载)在客户端浏览器中加载的正常方法。此应用程序包含许多小组件。这些组件的导航由 Angular Router配置管理。

Angular 为这些组件分配路径。甚至PageNotFoundComponent实际上是一个组件,它被放置在所有路由的末尾,以防 URL 与任何定义的路径不匹配。

由于所有这些都发生在 Angular 自己环境中的客户端浏览器中。因此不会向服务器发出 HTTP 请求。

当没有请求时,没有响应

因此,您无法实现所需的行为。

SSR(服务端渲染)

还有另一种类型的 Angular 应用程序,其中应用程序以静态 html 的形式从服务器呈现,而不是在客户端浏览器中执行。

Angular Universal在服务器上执行,生成静态应用程序页面,稍后在客户端引导。这意味着应用程序通常呈现得更快,让用户有机会在应用程序完全交互之前查看应用程序布局。

在这种情况下,Angular 应用程序的每个页面都来自服务器作为 HTTP 请求的响应。

所以

发送PageNotFoundComponent到客户端时也可以发送 404 状态代码。

您希望通过组件发送 404 错误的主要原因是搜索引擎不会缓存和索引具有 404 状态的页面。

您可以查看这篇有用的文章,该文章使用 SSR 和 Angular Universal 来实现此行为。


Akk*_*ekt 5

我猜你在这里混合了两个概念:

如果{ path: '**', component: PageNotFoundComponent }您的路由器无法解析给定的 url,您可以定义应显示的组件。请求在客户端处理,Angular 提供定义的组件/页面,因此请求 http 状态代码为 200,因为从来没有找不到资源。

如果 404 页面是异步加载的或者包含任何额外的资源(例如图像),通常只有 http 请求。

当网络服务器找不到所请求的资源时,另一端就会出现 HTTP 404。因此在这种情况下,服务器会处理响应并提供正确的 http 状态代码。

因此,总而言之,您的用例没有多大意义,因为如果您想使用 Angular 提供自定义 404 错误页面,则 http 响应代码必须为 200。