关于react-router中browserHistory的绝对路径问题

#1

最近在学习react,用到了react-router来做路由控制,官方推荐使用browserHistory,但是我发现在使用browserHistory时,应用监测的url是地址栏里的整个路径,比如我在项目里这样配置路由:

<Router onUpdate={() => window.scrollTo(0, 0)} history=browserHistory}>
        <Route path='/' component={App} >
               <IndexRoute component={Home}/>
               <Route path='login' component={Login}/>
               <Route path='chatlist' component={ChatList}/>
               <Route path='chatroom/:id' component={Chatroom}/>
        </Route>
</Router>

如果使用webpack服务器进行开发的话,那么地址栏里的url应该长成类似这样:localhost:3004/login
这是可行的,因为配置里有这段路由。

但是如果我把项目打包好后,放到了apache服务器上的某个文件夹下我的项目名称(react-chat是),例如:http://localhost/Projects/react-chat/login,运行的时候,就会报错,提示我没有找到与Projects/react-chat/login匹配的路由,这也就是说,browserHistory匹配路由是从根目录开始匹配的,所以这让我很困惑,难道他不应该是从项目目录开始匹配路由才对么?

然后我在官网的文档里看到了react-router的useRouterHistory,用于自定义history,所以照葫芦画瓢,定义了它的根目录:

const appHistory = useRouterHistory(createHistory)({
    basename: '/Projects/react-chat/'        // 根目录名
});

然后用appHistory代替了browserHistory,结果运行正确了,,可是,,问题来了,那岂不是打包好的项目只能放在指定的目录下才能运行,若是放在别处,路径仍然是错误的啊。

后来我怀疑是不是我的apache的.htaccess配置文件有错,官方给的配置规则是这样的:

RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]

这完全就不对啊,它直接把目录转向了根目录,并请求了根目录下的index.html,离我的项目路径更远了啊。。。

至此,,我已经不知道是哪里有问题了,,不知道有没有遇到类似问题的朋友,还请帮忙解惑,谢谢了

#2

个人意见:不应该动前端的配置,改后端的配置比较好

#3

后端的htaccess文件不知道是不是弄错了

#4

我碰到和你一样的问题,现在看来是只能使用 hashHistory。你现在解决 browserHistory 的这个问题了吗?

#5

github-服务器改造

官方明确说了,使用需要对服务器改造,点上面链接去看吧。

#6

请问你解决了吗?

#7

使用browserHistory后,需要服务端重定向,把所有请求都重定向到/,这样react-router就能识别出当前路由

#8

在创建history时,里面的basename修改成你想要的。

#9

不知道你的问题解决了没有,但是我记得在package.json的运行命令中加一个参数–history-api-fallback就好了,但是限于webpack-dev-server 启动的开发环境的服务。要是处于生产环境的话,要配置basename和你的路径匹配。尤其是nginx服务。希望能帮到你