页面重定向但不响应301代码 - React Router

时间:2016-12-22 12:32:35

标签: reactjs redirect react-router

我在我的ReactJS应用程序中使用react-router,我使用以下命令重定向页面。

this.context.router.replace(generateProductURL(oProduct));

这会使用200 OK代码正确地重定向页面。我想要301重定向。任何帮助?

这是我的服务器代码:

match({ history, routes: getRoutes(store), location: req.originalUrl }, (error, redirectLocation, renderProps) => {
    if (redirectLocation) {
      res.redirect(redirectLocation.pathname + redirectLocation.search);
    } else if (error) {
      console.error('ROUTER ERROR:', pretty.render(error));
      res.status(500);
      hydrateOnClient();
    } else if (renderProps) {
      loadOnServer({...renderProps, store, helpers: {client}}).then(() => {
        const component = (
          <Provider store={store} key="provider">
            <ReduxAsyncConnect {...renderProps} />
          </Provider>
        );

        const is404 = renderProps.routes.find(r => r.status === 404) !== undefined;
        if (is404) {
          res.status(404);
        } else {
          res.status(200);
        }

        global.navigator = {userAgent: req.headers['user-agent']};

        res.send('<!doctype html>\n' +
          ReactDOM.renderToString(<Html assets={webpackIsomorphicTools.assets()} component={component} store={store}/>));
      });
    } else {
      res.status(404).send('Not found');
    }

1 个答案:

答案 0 :(得分:0)

tl; dr 您需要使用onEnter函数(传递给挂钩的第二个参数)重定向replace挂钩。

要了解调用this.context.router.replace不会触发重定向的原因,您需要了解<Redirect>组件 触发重定向的原因。

什么是<Redirect>

<Route>组件类似,<Redirect>不是“真实”组件,因为它不会呈现任何内容。相反,它只返回一个路由对象。 <Redirect>的路由对象包含onEnter挂钩,该挂钩调用挂钩的replace方法,为其提供重定向的位置。

replace({
  pathname,
  query: route.query || location.query,
  state: route.state || location.state
})

检测重定向

match检测重定向的方式是通过onEnter挂钩。 onEnter挂钩的第二个参数是replace函数。调用replace函数时,它会将location参数存储为redirectInfo

let redirectInfo
function replace(location) {
  redirectInfo = location
}

现在,当您致电match时,它会遍历您的所有路线并确定哪些路线与当前位置匹配(req.url)。然后它运行任何onLeaveonChangeonEnter挂钩(但是只有onEnter挂钩用于服务器渲染,所以我们可以忽略其他人。)< / p>

当运行匹配路由的onEnter挂钩时,如果在任何时间点它检测到redirectInfo变量已被设置(由replace函数),则{您传递给match的{​​3}},提供redirectLocation

if (error || redirectInfo) {
  done(error, redirectInfo) // No need to continue.
}

然后,在match函数中,使用redirectLocation触发重定向。

res.redirect(redirectLocation.pathname + redirectLocation.search);

以编程方式重定向

因此,如果您想重定向自己,则需要使用<Route>函数在onEnter的{​​{1}}挂钩中执行此操作。 replace将包含匹配的路由以及任何已解析的参数。

nextState