我使用反应路由器作为根和"/"下的所有请求都指向反应路由器。并且当响应路由器发现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'
});
});
禅宗:静默网络的错误代码是什么?
我对这个问题也感到困惑。奇怪的是,您没有更改HTTP错误代码。我们认为应该,因为调用了一个随机URL,但为什么?
在SPA(单页应用程序)中,没有网络流量,只有窗格切换。HTTP错误代码位于为新页面提供服务的标题中,而所有内容都位于命名的
而且,它只是用户。404错误代码或任何其他HTTP代码实际上是对浏览器或服务的提示。如果请求者是一个浏览器,那么人类会得到比浏览器更好的指示。如果请求者是爬虫,它可能会扫描
中的404
所以答案是,我们设置HTTP状态码是出于习惯。不要。
我做了一些挖掘,这是我们在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
属性。可能是打字的错误。不过这很好用。
使用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?我还在我的服