当前位置: 首页 > 知识库问答 >
问题:

如何让react路由器响应404状态码?

乐欣可
2023-03-14

我使用反应路由器作为根和"/"下的所有请求都指向反应路由器。并且当响应路由器发现url与任何定义的组件不匹配时,它将呈现NoMatch组件。问题来了,NoMatch被渲染了,这就是我想要的,但是状态代码仍然是200而不是404。当我的css或js文件被放置在一个错误的url反应路由器做同样的事情,它的反应200!然后页面告诉我,我的资源内容类型有一些问题!

那么,我如何使用react router来处理“/”中的所有内容,并且仍然让它正确处理404错误(以404状态代码进行响应)?

react路由器中的代码

render((
  <Router history={browserHistory}>
    <Route path="/" component={App}>
      <IndexRoute component={Index}/>
      <Route path="archived" component={App}>
        <IndexRoute component={ArchivedPage}/>
        <Route path="project/:projectId" component={ArchivedDetailPage}/>
      </Route>
      <Route path="*" component={NoMatch}/>
    </Route>
  </Router>
), document.getElementById('app'));

服务端

  router.use('/', function(req, res, next) {
    res.render('index-react', {
      title: 'some title'
    });
  });

共有3个答案

景靖琪
2023-03-14

禅宗:静默网络的错误代码是什么?

我对这个问题也感到困惑。奇怪的是,您没有更改HTTP错误代码。我们认为应该,因为调用了一个随机URL,但为什么?

在SPA(单页应用程序)中,没有网络流量,只有窗格切换。HTTP错误代码位于为新页面提供服务的标题中,而所有内容都位于命名的

而且,它只是用户。404错误代码或任何其他HTTP代码实际上是对浏览器或服务的提示。如果请求者是一个浏览器,那么人类会得到比浏览器更好的指示。如果请求者是爬虫,它可能会扫描中的404

所以答案是,我们设置HTTP状态码是出于习惯。不要。

艾学海
2023-03-14

我做了一些挖掘,这是我们在v4版本中的做法。

<Route
  render={({ staticContext }) => {
    if (staticContext) {
      staticContext.statusCode = 404
    }
    return <NotFound />
  }}
/>

Road组件用于访问static Context,其中有一个statusCode道具,如果您在服务器上使用Static Rout组件渲染,则可以设置该道具。

服务器代码看起来像这样(使用一些TypeScript类型)

const currentLocation: Location = {
  pathname: req.pathname,
  search: req.search,
  hash: '',
  state: undefined
}

const staticRouterContext: StaticContext & StaticRouterContext = {}

ReactDOMServer.renderToString(
  <StaticRouter location={currentLocation} context={staticRouterContext}>
  ...
  </StaticRouter>
)

if (staticRouterContext.statusCode) {
  res.status(staticRouterContext.statusCode)
}

注意:我认为打字有点不可靠,因为StaticRouterContext没有statusCode界面中的statusCode属性。可能是打字的错误。不过这很好用。

令狐跃
2023-03-14

使用react路由器2.0。0您可以执行以下操作:

<Route path="*" component={NoMatch} status={404}/>

编辑:

您需要做的是在管线定义上创建一个自定义属性,如上面所示(状态)。

当你要在服务器端渲染你的组件时,检查这个属性并发送一个带有这个属性代码的响应:

路线。js

import React from 'react';
import {IndexRoute, Route} from 'react-router';

import {
    App,
    Home,
    Post,
    NotFound,
} from 'containerComponents';

export default () => {
    return (
    <Route path="/" component={App}>

        <IndexRoute component={Home} />
        <Route path='post/' component={Post} />

        { /* Catch all route */ }
        <Route path="*" component={NotFound} status={404} />

    </Route>
  );
};

server.js:

import { match } from 'react-router';
import getRoutes from './routes';
....
app.use((req, res) => {
match({ history, routes: getRoutes(), location: req.originalUrl }, (error, 
        redirectLocation, renderProps) => {
        if (redirectLocation) {
          res.redirect(redirectLocation.pathname + redirectLocation.search);
        } else if (error) {
          console.error('ROUTER ERROR:', error);
          res.status(500);
        } else if (renderProps) {

            const is404 = renderProps.routes.find(r => r.status === 404) !== undefined;
        }
        if (is404) {
          res.status(404).send('Not found');
        } else {
            //Go on and render the freaking component...
        }
    });
});

很抱歉。。。当然,我的解决方案本身不起作用,并且我错过了正确的代码片段,您实际上在其中检查该属性并相应地进行渲染。

如您所见,我只是将“未找到”文本发送到客户端,但是,最好是从RenderOps(本例中为NoMatch)捕获要渲染的组件并进行渲染。

干杯

 类似资料:
  • 问题内容: 我有正常路线 使用from 。 奇怪的是,这个组件很长一段时间都没有出现问题,但是现在当我用说的时候,它无法在travis- ci上编译 我在我的PrivateRoute组件中设置了此状态,这是带有重定向的非常标准的 如何更新要包含的对象的类型 编辑: 解决方案是添加 复制package.json之后,将其复制到我的Dockerfile中。 问题答案: 看起来您没有对软件包使用锁定文件

  • 我有一个反应路由器3.0。0安装程序,其中包含我显示为后备的NotFound组件: 然而,这会返回一个重定向,谷歌爬虫正在抱怨软404。我是否可以重定向到我的NotFound组件并发送404,例如与Github类似?我在这里尝试了以下建议:如何让react路由器响应404状态码? 但这只是给了我一个404,没有显示组件。 如何做到以上几点?

  • 所以我面临的问题是,当我点击Hover Books组件中的链接进入一个新页面时,我可以在其中呈现图书状态,但当我按下它时,什么也没有发生。我知道错误可能在哪里(路由)。如果你能帮我修好它,我将不胜感激。谢谢

  • Redux提倡使用具有单一状态的单一存储。但是,使用react router,您可以获得多个页面,每个页面都有自己的顶级根组件。 一个人应该如何用一个有多个页面的反应路由器应用程序连接redux?React-router 1.0不再允许您向路由传递道具,因此使路由器成为包含所有页面状态的顶级组件不再可能也不可行。

  • 我在TYPO3 v10中为我的robots.txt使用静态文本路由(默认为. htaccess文件)。文本按预期传递,但标头中的StatusCode为404。我不知道如何解决这个问题,因为静态文本路由中没有设置状态代码的选项。 这是我的路线代码(如文档中所述:https://docs.typo3.org/m/typo3/reference-coreapi/10.4/en-us/ApiOvervie

  • 我在我的服务器上部署反应应用程序,它在localhost上运行良好,但当我试图在我的服务器上使用它时,我得到了 加载资源失败:服务器响应状态为404(未找到)shayankh。me/graphql 我在服务器上的根位置是 /var/www/html/ '这是我的server.js 和索引。js 我不知道我的问题出在哪里。是否有可能是因为服务器的根位置,我的应用程序找不到GraphQL?我还在我的服