我有一个单页应用程序,其中所有路由都是在客户端上使用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
状态。
所以我想我们应该用302
或301
重定向/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消息,那也没关系。这是我认为直观的。
这是我对这个请求流的想法:
- 客户端获取/无效路由->服务器
- 服务器404
<Redirect to="/404-page"/>
->客户端 - 客户端GET/404页面->服务器
- 服务器404/404页面->客户端
我认为混淆源于将404页面视为一个现有资源,当请求时应该返回200。我更喜欢把404页面看作一个页面,而更多的是一个404状态代码,其中包含一些可人工编辑的html来呈现代码。