vue3 vite axios里的url加上域名后本地proxy配置无效

在 Vue 项目中使用 Vite 作为构建工具时,如果在 axios 的请求 URL 中直接指定了完整的域名(例如 http://example.com/api),那么 Vite 的代理配置 (proxy) 将不会生效。这是因为 Vite 的代理配置仅对开发环境中的相对路径有效,当 URL 包含完整域名时,请求将直接发送到指定的服务器,而不会被代理。

解决方案

1、修改请求 URL 为相对路径: 如果可能的话,将请求 URL 修改为相对路径(例如 /api),然后通过 Vite 的代理配置来重定向这些请求到目标服务器。

2、使用环境变量替换域名:

  • 在 .env 文件中定义一个环境变量,例如 VITE_API_BASE_URL=http://localhost:3000。
  • 在你的代码中使用这个环境变量来构建请求 URL。
import { computed } from 'vue';

const baseUrl = import.meta.env.VITE_API_BASE_URL;
const apiRequestUrl = computed(() => `${baseUrl}/api/some-endpoint`);

3、配置 axios 实例的拦截器:

可以在 axios 实例上配置请求拦截器,用来修改请求的 URL。

import axios from 'axios';

const instance = axios.create();

instance.interceptors.request.use(config => {
  if (config.url.startsWith('http')) {
    // 如果 URL 已经包含了完整域名,则不进行任何修改
    return config;
  }
  // 否则,添加代理前缀
  config.url = '/api' + config.url; // 假设 Vite 代理配置中使用了 /api 作为前缀
  return config;
});

export default instance;

4、调整 Vite 配置文件: 确保你的 Vite 配置文件 (vite.config.ts 或 vite.config.js) 中正确设置了代理规则。

import { defineConfig } from 'vite';

export default defineConfig({
  server: {
    proxy: {
      '/api': {
        target: 'http://example.com',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '')
      }
    }
  }
});

通过上述方法之一,你可以解决在使用完整域名 URL 时遇到的 Vite 代理配置无效的问题。选择最适合你项目需求的方法来实施。

Vite + Vue3 中处理axios的跨域问题,通常不需要后端配置,因为Vite提供了一个内置的开发服务器,可以自动处理本地开发环境下的CORS问题。以下是一种常见的解决方案: 1. **Vue.config.js 配置**: - 在`src`目录下创建或打开`vue.config.js`文件,这是一个全局的配置文件。 ```javascript import axios from &#39;axios&#39;; module.exports = { devServer: { proxy: [ // 使用代理规则,将所有匹配 &#39;/api&#39; 的请求转发到 &#39;http://localhost:8080&#39; (假设你的后端服务运行在这) { target: &#39;http://localhost:8080&#39;, changeOrigin: true, pathRewrite: { &#39;^/api&#39;: &#39;&#39; }, // 将&#39;/api&#39;前缀替换为空字符串 }, ], }, configureWebpack: config => { if (process.env.NODE_ENV === &#39;production&#39;) { // 生产环境不启用代理,生产构建会直接发送请求到服务器 delete config.devServer.proxy; } }, axios: axios, // 注册axios实例,确保它会被应用到组件中 }; ``` 2. **在组件中使用axios**: 现在可以在Vue组件内部正常使用`this.$axios`,它已经配置好了跨域。 ```javascript <template> <div> <button @click="fetchData">获取数据</button> </div> </template> <script> import axios from &#39;axios&#39;; export default { methods: { fetchData() { this.$axios.get(&#39;/api/data&#39;).then(response => { console.log(response.data); }).catch(error => { console.error(&#39;Error fetching data:&#39;, error); }); }, }, }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值