我的理解是,您可以通过将{ path: '**', component: PageNotFoundComponent }
设置为RouterMoudle.forRoot(路由)来自定义未找到的页面。
然而,它返回http状态代码200。 如何返回状态码404?
答案 0 :(得分:3)
实际上它不会返回任何状态,该页面应与您的应用程序捆绑在一起,因此您将无法获得任何状态,因为没有请求。
发送404状态毫无意义,因为在角度应用程序中更改页面时没有真正的请求(因为它是单页应用程序)。
即使您的404页面位于延迟加载的模块中,您也必须获得200状态,因为捆绑包已正确加载。另外,您无法在客户端更改请求的状态。
如果您使用服务器端呈现(使用angular universal),那么您的服务器可能能够在页面加载时发送404状态,但这不会是用户浏览器从一个页面到另一个页面不存在的情况。
答案 1 :(得分:2)
Angular应用程序只是HTTP客户端,而不是服务器。因此组件无法返回HTTP代码。要访问PageNotFoundComponent,必须正确加载应用程序(HTTP 200)。
从应用程序的角度来看,没有发生任何错误,只是用户请求了一个回退到PageNotFoundComponent的路由,它与HTTP无关。
答案 2 :(得分:2)
我猜你在这里混合了两个概念:
使用{ path: '**', component: PageNotFoundComponent }
定义应显示的组件,如果路由器无法解析给定的网址。请求在clientside处理,angular提供定义的组件/页面,因此请求http状态代码为200,因为从未找到过无法找到的资源。
如果404页面是异步加载的,或者包含任何额外的资源,例如图像,通常只有http请求。
当网络服务器找不到所请求的资源时,另一方会发生HTTP 404。因此,在这种情况下,服务器会处理响应并提供正确的http状态代码。
所以你的所有用例都没有多大意义,因为如果你想提供一个带有角度的自定义404错误页面,http响应代码必须是200.
答案 3 :(得分:1)
您问题的简单答案是是和否
这取决于您的情况。 Angular应用程序有两种类型。
正常的Angular应用程序在浏览器中执行,以响应用户的操作在DOM中呈现页面
这些应用程序采用常规方法,将整个应用程序或应用程序的一部分(使用延迟加载)加载到客户端浏览器中。此应用程序包含许多小组件。这些组件的导航由Angular Router配置管理。
Angular将路径分配给这些组件。即使PageNotFoundComponent
实际上是一个组件,并且在URL与定义的路径都不匹配的情况下,它也位于所有路由的末尾。
由于所有这些都是在Angular自己的环境中的客户端浏览器中发生的。因此,不会向服务器发出HTTP请求。
没有请求时,没有响应
因此,您无法实现所需的行为。
还有另一种Angular应用程序,其中应用程序以静态html的形式从服务器呈现,而不是在客户端浏览器中执行。
Angular Universal在服务器上执行,生成静态应用程序页面,这些页面随后在客户端上启动。这意味着应用程序通常可以更快地渲染,从而使用户有机会在应用程序变得完全交互式之前查看其布局。
在这种情况下,Angular Application的每个页面都来自服务器,作为HTTP请求的响应。
所以
在向客户端发送
PageNotFoundComponent
时也可以发送404状态代码。
您希望通过组件发送404错误的主要原因是搜索引擎不缓存和索引404状态的页面。
您可以看看这个有用的article,它结合使用Angular Universal和SSR来实现此功能。