有些时候项目不是部署到根目录下的,我们在访问的时候需要在域名后边再加一级目录(比如A目录)。前端项目里也需要单独配置下(React项目)。
一、package.json 里要加一个
homepage": "/A/"
正常部署在根目录下的项目没有这个配置或者是个‘/’
二、路由外边也要加一个(伪代码)
import { BrowserRouter } from "react-router-dom";
...
return ( <BrowserRouter basename={'/A'}> ... </BrowserRouter> );
这样在二级目录下项目可以正常访问了。但是由于回调域名配置问题,想少配置一次回调域名,测试环境和正式环境要部署在一个域名下且都是二级目录下(比如A文件夹和B文件夹)。那么按照上边的方法对应修改/A 、/B 就行。但是这样的话每次测试和正式部署的时候都需要改这两个地方,我想要尽可能少的改东西(比较懒)。路由里边那个好办,配置环境变量就可以,但是package.json里那个没法用环境变量区分了。最后无奈改成了
homepage": "."
这个在项目打包后入口文件引其他资源文件时候会以相对路径去引,所以跟项目在哪个目录下没关系了。测试了在以指定url(指定具体路由)去访问是没有问题的,但是只是通过域名 + '/A' 这种去访问就访问不到了(本地启动时候也需要自己加上/A,本地暂时先不考虑)。而且我路由里边明明在最后配置了路由匹配不到跳到我指定的路由,但就是没有生效。后来查看控制台才发现他是在引资源文件时候路径出错了。因为我们只写了http://www.xxx.com/A
他会把/A当作页面的路由,这样就把根目录当成了当前目录了,所以在找其他资源文件时候也会从根目录找(实际上我们的资源文件是在A下边的),所以就找不到了。js没有正确引入,所以我们在路由里的代码也不会执行生效了。要解决这个问题只能在入口文件index.html里处理了。如果是以全路径访问的走正常的就行,如果是以http://www.xxx.com/A
这种形式访问的我们要给他跳到我们指定路由页面。
<script> // 线上环境不输路由时候重定向到login if (window.location.pathname.split('/').length === 2) { window.location.href = window.location.href + '/login' } </script>
这个问题算是解决了。