我应该使用什么HTTP状态来发送404页面



我有一个单页应用程序,其中所有路由都是在客户端上使用react-router-dom完成的。

我的应用程序允许一组精确的匹配路线。

对于该集合之外的任何路由,它都将被视为无效,客户端代码将把您重定向到/404-page路由。

所以当我在服务器上渲染时,我也需要这样做

这就是流程:

  • 您将向我的服务器请求/invalid-route
  • 来自react-router的代码将呈现<Redirect to="/404-page"/>
  • 我需要将您的请求重定向到/404-page
  • 我应该使用什么代码进行重定向

我想我应该设置status = 404。因为没有找到那条路线,对吧?

类似于:

// YOU'VE REQUESTED SOME /invalid-route
res.status(404).redirect(ROUTES.NOT_FOUND);

但现在你要向我的服务器询问/404-page路由。它将实际呈现404 Page

  • 您要求/404-page
  • 我的服务器将为您呈现一个404页面
  • 404页面应该使用哪个状态代码

我应该使用200 Ok吗?既然我的/404-page是一个有效且现有的URL,它实际上会呈现一些东西?

// NOW YOU ARE REQUESTING MY /404-page
res.status(200).send( // 404 PAGE HTML );

这样做对吗?


更新:

我的问题是假设出了什么问题。

当用户请求/invalid-url时,您不能同时发送404和重定向。

因为以下代码:

// YOU'VE REQUESTED SOME /invalid-route
res.status(404).redirect(ROUTES.NOT_FOUND);
// NOW YOU ARE REQUESTING MY /404-page
res.status(200).send( // 404 PAGE HTML );

产生以下结果:

[![在此输入图像描述][1]][1]

重定向是使用302完成的,尽管我使用的是res.status(404).

这根本不是故意的。因为没有发出404状态。

所以我想我们应该用302301重定向/invalid-route,并为/404-page发送404

类似于:

// YOU'VE REQUESTED SOME /invalid-route
res.status(302).redirect(ROUTES.NOT_FOUND);
// NOW YOU ARE REQUESTING MY /404-page
res.status(404).send( // 404 PAGE HTML );

更新2:

这不起发送301的作用

// THIS SENDS A 302, EVEN THOUGH SETTING 301
res.status(301).redirect(ROUTES.NOT_FOUND);

要在重定向上发送301,我必须执行以下操作:

// THIS SYNTAX ALLOWS YOU TO CHOOSE THE STATUS CODE FOR THE REDIRECT
res.redirect(301,ROUTES.NOT_FOUND);
``´

[1]: https://i.stack.imgur.com/jNnfN.png

我的直觉是404页面应该总是返回404状态。如果它附带了一个实际的页面来显示404消息,那也没关系。这是我认为直观的。

这是我对这个请求流的想法:

  1. 客户端获取/无效路由->服务器
  2. 服务器404<Redirect to="/404-page"/>->客户端
  3. 客户端GET/404页面->服务器
  4. 服务器404/404页面->客户端

我认为混淆源于将404页面视为一个现有资源,当请求时应该返回200。我更喜欢把404页面看作一个页面,而更多的是一个404状态代码,其中包含一些可人工编辑的html来呈现代码。

最新更新