首页 > 解决方案 > 我应该使用什么 HTTP 状态来发送 404 页面?

问题描述

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

我的应用程序允许一组完全匹配的路线。

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

所以当我在服务器上渲染时我需要做同样的事情。

这是流程:

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

就像是:

// YOU'VE REQUESTED SOME /invalid-route

res.status(404).redirect(ROUTES.NOT_FOUND);

但现在你要向我的服务器询问/404-page路线。这实际上会呈现一个404 Page

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

// NOW YOU ARE REQUESTING MY /404-page

res.status(200).send( // 404 PAGE HTML );

这是这样做的正确方法吗?


更新:

我的问题是假设有问题。

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

因为下面的代码:

// 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发出任何状态。

所以我想我们应该/invalid-route302or重定向301,然后发送404for/404-page

就像是:

// 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

标签: node.jsexpresshttphttp-status-code-404server-side-rendering

解决方案


我的直觉说 404 页面应该总是返回 404 状态。如果它带有一个显示 404 消息的实际页面,那很好。这是我认为直观的。

这是我对这个请求流的心声:

  1. 客户端 GET /invalid-route -> 服务器
  2. 服务器 404 <Redirect to="/404-page"/>-> 客户端
  3. 客户端 GET /404-page -> 服务器
  4. 服务器 404 /404-page -> 客户端

我认为混淆来自于将 404 页面视为现有资源,在请求时应返回 200。我更喜欢将 404 页面视为更少的页面,更多的是 404 状态代码,并带有一些人类可红色的 html 来呈现代码。


推荐阅读