React-router "Cannot GET /*" 除了 root url
React-router "Cannot GET /*" except for root url
我愿意为我的应用程序使用 React-router,我正在尝试 the example given in the doc,我在下面复制了它。现在,当我转到 localhost:3000/
时,我会按预期看到 "App",但每隔一页,例如 localhost:3000/inbox
returns "Cannot GET /inbox"。我在这里错过了什么?
var About = React.createClass({
render: function () {
return <h2>About</h2>;
}});
var Inbox = React.createClass({
render: function () {
return <h2>Inbox</h2>;
}});
var App = React.createClass({
render () {
return (
<div><h1>App</h1>
<RouteHandler/>
</div>
)}});
var routes = (
<Route path='/' handler={App}>
<Route path="about" handler={About}/>
<Route path="inbox" handler={Inbox}/>
</Route>
);
我认为问题在于您正在发出 http 资源请求:
GET /inbox HTTP/1.1
Host: localhost:3000
但正在使用仅客户端路由。您是否也打算进行服务器端渲染?您可能需要将路由器位置更改为 HistoryLocation
而不是 HashLocation
(默认值)。
Router.run
的 location 属性告诉它在哪里匹配路由。如果您不是 运行 服务器端 React,我相信您必须使用 Router.HashLocation
(或者将其留空)。
如果不是,则说明您访问组件的方式有误。尝试使用 http://localhost:3000/#/inbox
。熟悉 React-Router 可能需要一点时间,但这绝对值得!
最简单的选项:改用哈希历史记录。保留的网址不是很好,如果您需要更好的 SEO,我也会选择服务器端呈现。
如果您对此有兴趣,这个答案对我很有帮助:
如果您使用 webpack-dev-server
,则有一个名为 history-api-fallback
的选项。如果设置为 true
404s 将回退到 /index.html
.
将选项添加到 Webpack 配置的 devServer
部分,如下所示:
devServer: {
contentBase: 'app/ui/www',
devtool: 'eval',
hot: true,
inline: true,
port: 3000,
outputPath: buildPath,
historyApiFallback: true,
},
Link 到 Webpack 文档:https://webpack.js.org/configuration/dev-server/
webpack-dev-server
Github 上的文档:https://github.com/webpack/webpack-dev-server
请求将发送到服务器,directory/file并不真正存在所以它会return404,所以你必须告诉服务器return索引所有请求的页面,反应将处理生根:
如果像我一样,您正在 IIS 上托管您的 React 应用程序,只需添加一个包含 :
的 web.config 文件
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
</configuration>
这将告诉 IIS 服务器 return 客户端的主页而不是 404 错误。
我遇到了同样的问题,如果你有一个响应请求的服务器和一个 HashRouter,如果你使用的是静态文件服务器。而不是使用 BrowserRouter 使用 HashRouter 它不是完美的修复,但应该解决 cannot GET "/path" 错误。请务必从 'react-router-dom'
导入 HashRouter
render() {
return (
<div>
<HashRouter>
<Blog />
</HashRouter>
</div>
);
}
补充那些没有得到答案的人:historyApiFallback: true
仅适用于 url 的第一级。所以 site.com/about
将被重定向到索引,但 site.com/about/me
不会。在这种情况下,您需要添加 rewrite
选项:
historyApiFallback: {
rewrites: [
{ from: /./, to: '/index.html' }
]
}
这将使用正则表达式匹配所有路由。注意还要添加:
output: {
// ...
publicPath: '/'
//...
},
否则,重定向将工作到 index.html,但 index.html 可能只有 bundle.js
作为 webpacked 脚本,并且无法正确读取。它应该改为 '/bundle.js'
,此配置选项将执行此操作。
我愿意为我的应用程序使用 React-router,我正在尝试 the example given in the doc,我在下面复制了它。现在,当我转到 localhost:3000/
时,我会按预期看到 "App",但每隔一页,例如 localhost:3000/inbox
returns "Cannot GET /inbox"。我在这里错过了什么?
var About = React.createClass({
render: function () {
return <h2>About</h2>;
}});
var Inbox = React.createClass({
render: function () {
return <h2>Inbox</h2>;
}});
var App = React.createClass({
render () {
return (
<div><h1>App</h1>
<RouteHandler/>
</div>
)}});
var routes = (
<Route path='/' handler={App}>
<Route path="about" handler={About}/>
<Route path="inbox" handler={Inbox}/>
</Route>
);
我认为问题在于您正在发出 http 资源请求:
GET /inbox HTTP/1.1
Host: localhost:3000
但正在使用仅客户端路由。您是否也打算进行服务器端渲染?您可能需要将路由器位置更改为 HistoryLocation
而不是 HashLocation
(默认值)。
Router.run
的 location 属性告诉它在哪里匹配路由。如果您不是 运行 服务器端 React,我相信您必须使用 Router.HashLocation
(或者将其留空)。
如果不是,则说明您访问组件的方式有误。尝试使用 http://localhost:3000/#/inbox
。熟悉 React-Router 可能需要一点时间,但这绝对值得!
最简单的选项:改用哈希历史记录。保留的网址不是很好,如果您需要更好的 SEO,我也会选择服务器端呈现。
如果您对此有兴趣,这个答案对我很有帮助:
如果您使用 webpack-dev-server
,则有一个名为 history-api-fallback
的选项。如果设置为 true
404s 将回退到 /index.html
.
将选项添加到 Webpack 配置的 devServer
部分,如下所示:
devServer: {
contentBase: 'app/ui/www',
devtool: 'eval',
hot: true,
inline: true,
port: 3000,
outputPath: buildPath,
historyApiFallback: true,
},
Link 到 Webpack 文档:https://webpack.js.org/configuration/dev-server/
webpack-dev-server
Github 上的文档:https://github.com/webpack/webpack-dev-server
请求将发送到服务器,directory/file并不真正存在所以它会return404,所以你必须告诉服务器return索引所有请求的页面,反应将处理生根:
如果像我一样,您正在 IIS 上托管您的 React 应用程序,只需添加一个包含 :
的 web.config 文件<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
</configuration>
这将告诉 IIS 服务器 return 客户端的主页而不是 404 错误。
我遇到了同样的问题,如果你有一个响应请求的服务器和一个 HashRouter,如果你使用的是静态文件服务器。而不是使用 BrowserRouter 使用 HashRouter 它不是完美的修复,但应该解决 cannot GET "/path" 错误。请务必从 'react-router-dom'
导入 HashRouterrender() {
return (
<div>
<HashRouter>
<Blog />
</HashRouter>
</div>
);
}
补充那些没有得到答案的人:historyApiFallback: true
仅适用于 url 的第一级。所以 site.com/about
将被重定向到索引,但 site.com/about/me
不会。在这种情况下,您需要添加 rewrite
选项:
historyApiFallback: {
rewrites: [
{ from: /./, to: '/index.html' }
]
}
这将使用正则表达式匹配所有路由。注意还要添加:
output: {
// ...
publicPath: '/'
//...
},
否则,重定向将工作到 index.html,但 index.html 可能只有 bundle.js
作为 webpacked 脚本,并且无法正确读取。它应该改为 '/bundle.js'
,此配置选项将执行此操作。