最近写外包程序,需要给用户远程提供研发测试环境,为了方便维护研发环境,使用了宝塔面板进行搭建
该项目是一个unapp+fastadmin 开发的app,以及后台管理。
然后发现了一个坑。
众所周知app和前后端分离的站都会涉及跨域访问问题
在fastadmin中,在config.php文件中有配置跨域访问的参数,并且校验方法在common.php文件中有访问方法。下图

在app端,我进行了一些配置,没有发现任何问题,可以正常访问接口。但是在给h5端导出的服务器上,则无法获取接口数据,报cors error
那么说明代码层的跨域检测没有起作用,也就是说请求在服务器层就被拦截了。(验证----在index.php页面的第一行代码进行断点输出)
我搜了下宝塔的相关配置,发现确实有有相关文章,并进行了配置。

依然报cors error
此时我再次进行断点,发现此时变成了代码层的拦截。最后在此处找到了原因,如图,我将这行有问题的代码进行了注释,就变得正常了。

好了,这个坑填上了。
在新版本的宝塔中,更新了cros的管理,这个在之前是没有的,而对于fastadmin来说本身就含有对cros的管理。这两个管理冲突了,两人都在返回头中添加了Access-Control-Allow-Origin。又去找了宝塔的以前版本,发现之前确实这一块确实是新做的。
那么新的问题又来了,为什么前端在本地开发的时候或者打包成app在手机端使用接口的时候没有报错呢?
我仔细比较了一下请求,发下大概是这里的原因

在xbuilder中,Origin 访问源为localhost,骗过了线上的服务器,认为其是服务器的本地访问。我想在app中也是如此。app不会使用线上js文件请求数据,而是存储到了用户手机的app中。和xbuilder开发骗过服务器是一样的。
但是如果将前端的代码放到单独的服务器时,浏览器请求使用的Origin是前端服务器绑定域名。因此造成了cors 跨域。