node.js - 我应该使用什么 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
吗?由于 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-route
用302
or重定向301
,然后发送404
for/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
解决方案
我的直觉说 404 页面应该总是返回 404 状态。如果它带有一个显示 404 消息的实际页面,那很好。这是我认为直观的。
这是我对这个请求流的心声:
- 客户端 GET /invalid-route -> 服务器
- 服务器 404
<Redirect to="/404-page"/>
-> 客户端 - 客户端 GET /404-page -> 服务器
- 服务器 404 /404-page -> 客户端
我认为混淆来自于将 404 页面视为现有资源,在请求时应返回 200。我更喜欢将 404 页面视为更少的页面,更多的是 404 状态代码,并带有一些人类可红色的 html 来呈现代码。
推荐阅读
- javascript - 将类扩展到多个类实例Javascript
- java - 如何在 SAML-Authentication 中允许 url 并在 Spring 中使用 Basic-Authentication 验证该 url
- button - Kivy:.py 文件中的按钮绑定
- flutter - 可以在颤振中重用sqlite批处理吗?
- javascript - 无法将对象添加到 javascript 中的空数组
- java - 查找对象数组列表的最大值
- python - Python Web Scraping an element - 尝试直到它工作,然后等待,然后再试一次
- python - Beautifulsoup - 为什么无法抓取这个网站?
- airflow - 无法安装 apache-airflow==2.0.0,因为这些软件包版本具有冲突的依赖项
- reactjs - eslint 不适用于 app.js,但适用于其他项目文件