最近在学习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,离我的项目路径更远了啊。。。
至此,,我已经不知道是哪里有问题了,,不知道有没有遇到类似问题的朋友,还请帮忙解惑,谢谢了