【问题标题】:What HTTP status should I use to send a 404 page?我应该使用什么 HTTP 状态来发送 404 页面?
【发布时间】:2020-08-25 05:52:35
【问题描述】:

我有一个单页应用程序,其中所有路由都在客户端上完成,使用 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

【问题讨论】:

    标签: node.js express http http-status-code-404 server-side-rendering


    【解决方案1】:

    我的直觉是 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 来呈现代码。

    【讨论】:

    • 是的,我不知道我是不是想多了。但无论哪种方式都感觉很奇怪。为实际存在的页面返回 404,即使是 404 页面,看起来也不对。
    • 我更新了我的问题,提供了更多细节。看来您无法在同一响应中使用 404 进行重定向。你要么做一件事,要么做另一件事。
    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2018-10-20
    • 2021-09-09
    • 2018-05-17
    • 2016-02-04
    相关资源
    最近更新 更多