axios跨域代理设置baseURL的一些问题

本文介绍了Vue项目中如何通过axios和环境变量配置proxy解决跨域问题,以及baseURL在开发和生产环境的不同用途,包括全路径配置以请求外站资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、为什么会跨域

        先了解跨域的概念:发送请求的url的协议域名端口三者之间任意一个与当前页面的地址不同则视为跨域。

        axios解决跨域很简单,只需要在 vue.config.js 设置 proxy 就可以了。

vue.config.js

devServer: {
    port: 8888,
    proxy: {
      '/dev-server':{
        target: 'http://localhost:8886/',
        // 跨域配置
        changeOrigin: true,
        // 路径重写 
        pathRewrite:{
              '^/api': '/'
          }
      },
      '/prod-server':{
        target: 'http://localhost:8887/',
        // 跨域配置
        changeOrigin: true,
        // 路径重写 
        pathRewrite:{
              '^/api': '/'
          }
      }
    }
  }

封装axios请求。

import axios from 'axios'

const baseUrl = "dev-server"

class HttpRequest {

  constructor(baseUrl){
    this.baseUrl = baseUrl
  }

  getDefaultConfig(){
    const config = {
      baseURL: this.baseUrl
    }
    return config
  }

  request(options){
    const instance = axios.create()
    options = Object.assign(this.getDefaultConfig(), options)
    return instance(options)
  }

}

export default new HttpRequest(baseUrl)

        处理跨域问题很简单,只需要设置baseURL,将端口进行代理于同一端口下,即使前后端分离,只要前端能直接访问到target的地址就问题不大。

2、开发环境生产环境自动配置

         在Vue项目的根目录下分别建立两个文件

        .env.development 和 .env.production ,其中的 ' . '  字符不可忽略。

#开发
.env.development
VUE_APP_BASEURL=/dev-server

#生产
.env.production
VUE_APP_BASEURL=/prod-server

        development  开发环境,和上面 vue.config.js 配置的 dev-server 相对,在开发时 axios 获取 server 的 baseURL 就会匹配 http://localhost:8886/ 这个地址。

        production 生产环境 , 和上面 vue.config.js 配置的 prod-server 相对,打包之后访问 http://localhost:8887/ 需要注意的是打包之后 Vue 的代理就失效了,需要 nginx 将后台服务代理到同一个端口上。

封装axios请求。

import axios from 'axios'

const baseUrl = process.env.VUE_APP_BASEURL

class HttpRequest {

  constructor(baseUrl){
    this.baseUrl = baseUrl
  }

  getDefaultConfig(){
    const config = {
      baseURL: this.baseUrl
    }
    return config
  }

  request(options){
    const instance = axios.create()
    options = Object.assign(this.getDefaultConfig(), options)
    return instance(options)
  }

}

export default new HttpRequest(baseUrl)

nginx.conf

location /server {
		root /data;
		index index.html;
		autoindex off;
}
location /prod-server
{
	  proxy_pass http://127.0.0.1:8887;
}

3、baseURL的作用

        看了很多文章设置baseURL都是用来区分开发和部署环境的,这个用法没有问题,而且确实很方便。

#相对地址
.env.development
VUE_APP_BASEURL=/dev-server

#绝对地址
.env.production
VUE_APP_BASEURL=http://127.0.0.1:8887/prod-server

        baseURL还有一个作用就是直接请求原地址

        开发时配置  proxy 的 name 时请求的是基于 VUE 代理的相对地址

        只需要将baseURL改成全路径。

       这时候浏览器 Network 的 Request URL 就由原来的请求代理地址,变成了前端直接请求地址。

4、使用场景

        用全路径 baseURL 的场景通常是在请求外站请求,且服务器访问不到的情况下,此时使用全路径 baseURL 就可以解决这个问题。

        如果设置全路径 baseURL 之后,请求接口提示跨域,且增加跨域参数无法解决的情况下,有如下解决方案:

        1、修改谷歌浏览器的安全性。

        2、部署一个可以请求此地址的前端。

        3、使用外壳访问。

        推荐3。

### 解决 VSCode 中使用 Axios 遇到的问题 在 VSCode 的 WebView 环境下,由于浏览器的安全策略,默认情况下无法直接发起请求。为了绕过这一限制,可以通过消息通信机制实现插件与 WebView 之间的交互[^1]。 具体解决方案如下: #### 方法一:通过消息机制处理请求 WebView 并不支持直接发送 HTTP 请求,因此可以在主进程或扩展进程中完成实际的网络请求操作,并将结果返回给 WebView。以下是详细的实现方式: 1. **在主进程中编写请求逻辑** 主进程负责执行真正的请求并将其结果传递回前端页面。 ```javascript const vscode = require('vscode'); function sendCrossDomainRequest(url, callback) { fetch(url) .then(response => response.json()) .then(data => { // 将数据传回 webview 页面 vscode.postMessage({ command: 'cross-domain-response', data }); }) .catch(error => console.error('Error:', error)); } vscode.window.onDidReceiveMessage(message => { switch (message.command) { case 'send-cross-domain-request': sendCrossDomainRequest(message.url); break; } }, null); ``` 2. **在 WebView 中触发请求并通过消息获取结果** 使用 `postMessage` 向主进程发送请求指令,并监听来自主进程的消息回复。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Webview Example</title> </head> <body> <button id="fetchData">Fetch Data</button> <script type="text/javascript"> document.getElementById('fetchData').addEventListener('click', () => { window.acquireVsCodeApi().postMessage({ command: 'send-cross-domain-request', url: 'https://example.com/api/data' }); }); window.addEventListener('message', event => { const message = event.data; if (message.command === 'cross-domain-response') { console.log('Received cross domain data:', message.data); } }); </script> </body> </html> ``` 此方法利用了 VSCode 提供的消息通道来间接解决问题。 --- #### 方法二:调整服务端配置以支持 CORS 如果目标服务器由自己控制,则可以直接修改其响应头以允许特定源访问资源。例如,在 Node.js 应用程序中启用 CORS 支持[^3]: ```javascript const express = require('express'); const app = express(); app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '*'); // 或指定具体的名 res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); next(); }); // 定义 API 路由 app.get('/api/data', (req, res) => { res.json({ message: 'This is a test.' }); }); app.listen(3000, () => { console.log('Server running on port 3000.'); }); ``` 上述代码片段展示了如何设置 Express 框架下的 CORS 响应头。 --- #### 方法三:全局配置 Axios 默认参数 当遇到因未正确初始化而导致的错误时,可尝试重新设定 Axios 的默认行为[^2]: ```javascript import axios from 'axios'; // 设置基础路径和其他选项 axios.defaults.baseURL = '/'; axios.defaults.headers.common['Authorization'] = 'Bearer your_token_here'; axios.defaults.withCredentials = true; // 如果需要携带 Cookie ``` 注意该方案仅适用于部分场景,可能仍需配合其他手段才能彻底解决问题。 --- ### 总结 针对 VSCode 插件开发中的难题,推荐优先采用消息机制的方式(即方法一),因为它完全规避了浏览器层面的同源政策约束;而调整后端接口权限或者优化客户端工具库则作为辅助措施存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值