解决方案:
vue.config.js
文件,添加如下配置:module.exports = {
devServer: {
disableHostCheck: true,
//解决跨域问题
proxy: {
"/api": {
target: "http://localhost:8088/server",
changeOrigin: true,
pathRewrite: {
"^/api": ""
}
}
}
},
}
baseUrl
参数Vue.prototype.axios.defaults.baseURL = "/api";
这样所有的跨域请求,如:http://localhost:8088/server/XXX
都通过代理的方式转换为:http://localhost:8080/api/XXX
,实际上是把跨域转换为不跨域。
但是这种方案只适用于开发过程中,项目打包部署后,项目中配置的代理将失效。需要使用nginx反向代理将所有的/api
请求映射到http://localhost:8088/server
上实现
解决方案:通过配置nginx代理解决,nginx主要配置如下:
server {
#监听80端口
listen 80;
#服务名称
server_name localhost;
#反向代理,location越靠前优先级越高,所以此项配置必须放在location /之前,否则会失效
location /api {
#被代理路径,只能是域名或ip:port形式,以/结尾表示用/替换掉/api
proxy_pass http://127.0.0.1:8088;
#重写url路径,把/api修改为/dlcsh/server/,其他不变$1表示前边()中的分组
rewrite ^/api/(.*)$ /server/$1 break;
}
location / {
#vue项目路径
root /app/web/dist;
index index.php index.html index.htm;
}
}
重启nginx服务后可通过网络访问。后端项目部署在:127.0.0.1:8088
上。另附nginx主要命令
#重新加载特定的nginx配置文件
./nginx -s reload -c /app/nginx/nginx.conf
#关闭nginx服务
./nginx -s stop
#重启nginx服务
./nginx -s reopen
#处理完所有请求后关闭nginx服务
./nginx -s quit
对基于electron-builder插件创建的桌面应用,所有的页面访问都被影射到了文件上,所以配置中的/api
访问都会映射到文件上,对vue的网络代理将失效。解决这一问题可以使用electron
的方式实现跨域请求,解决方案如下:
axios
模块的baseUrl
属性为真实的url地址Vue.prototype.axios.defaults.baseURL = "http://localhost:8088/server";
electron
主启动类(我的是background.js
文件)中关闭web权限检查async function createWindow() {
const win = new BrowserWindow({
...
webPreferences: {
...
//关闭web权限检查,允许跨域
webSecurity: false
}
})
//打包后开启控制台
//win.webContents.openDevTools();
...
}
重新打包项目后即可正常访问。
原创文章,欢迎,转载请联系作者,并注明出处,谢谢