我在我的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');
}
答案 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
)。然后它运行任何onLeave
,onChange
和onEnter
挂钩(但是只有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