vue跨域,proxyTable在baseURL为其他IP端口时失效问题
vue跨域问题:解决baseURL为某个其他ip端口,vue调试时的跨域问题
·
背景
在调试vue项目时我们通常会使用proxyTable来解决跨域问题,如设置axios的baseUrl为/xxx,然后在proxyTable设置拦截/xxx再转发到真实地址去即可,这种请求网上一堆方法不再赘述。但是如果前端不止要请求我们的后台,还要请求其他IP地址时,可能会通过新建一个axios然后设置baseUrl为目标IP、端口,这样在请求这个外部IP时只可以省略IP和端口。但是这样会出现跨域问题,且无法通过proxyTable解决。
解决方法
参考了https://segmentfault.com/q/1010000014869828 里面,中原大虾的回答。他的实现代码看不懂,我就按他这个思路用自己的方法实现。
思路
proxyTable失效是由于它只会拦截启动时的ip端口下的请求如localhost:8080,而不会拦截其他ip端口。解决思路就是使用axios的拦截器,如果我们要拦截’www.baidu.com’,就在请求拦截器里拦截baseUrl为’www.baidu.com’且当前环境是调试环境(ps:因为打包后通常是用nginx反向代理或者如果是apk则没有跨域问题能直接请求,这么处理是为了方便调试)的请求然后重写baseUrl 如改为’/baidu’,这样proxyTable就能拦截’/baidu’转发到百度地址
代码
axios设置
const service = axios.create({
baseURL: 'https://www.baidu.com/',
// withCredentials: true, // send cookies when cross-domain requests
timeout: 3000,
withCredentials: true // request timeout
})
// request interceptor
service.interceptors.request.use(
async config => {
// 调试时百度地址拦截,打成apk后无跨域问题不拦截
if (process.env.NODE_ENV == 'development' && config.baseURL =='https://www.baidu.com/'){
config.baseURL = '/baidu';
}
if (config.method === 'get') {
config.paramsSerializer = function(params) {
return qs.stringify(params, { indices: false })
}
}
return config;
},
error => {
return Promise.reject(error)
}
)
proxyTable
proxyTable: {
//百度请求代理
"/baidu": {
target: "https://www.baidu.com/",
changeOrigin: true, //允许跨域
pathRewrite: {
// 路径重写,
"^/baidu": "/"
logLevel: 'debug',
},
}
更多推荐
已为社区贡献1条内容
所有评论(0)