You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue Vite SPA请求Laravel API报404错误,求排查解决

问题分析与解决方案

核心问题

请求发往前端服务端口(5173)而非后端(8000),根源是axios的baseURL配置错误,同时缺少跨域代理配置导致潜在的浏览器跨域拦截问题。

1. 修复axios baseURL配置

你的src/services/api.js中错误地通过process.env.NODE_ENV.VUE_APP_API_URL访问环境变量,Vite会自动将VUE_APP_前缀的环境变量注入到process.env全局对象中,正确写法如下:

修改后的src/services/api.js:

import axios from 'axios';

const api = axios.create({ 
  baseURL: process.env.VUE_APP_API_URL 
});

export default api;

2. 配置Vite代理解决跨域

前端服务(5173)和后端服务(8000)属于不同端口,浏览器会触发跨域拦截。在vite.config.ts中添加代理配置,将前端API请求转发到后端:

修改后的vite.config.ts:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import VueRouter from 'unplugin-vue-router/vite'
import { VueRouterAutoImports } from 'unplugin-vue-router'
import Components from 'unplugin-vue-components/vite'
import { HeadlessUiResolver } from 'unplugin-vue-components/resolvers'

export default defineConfig({
  plugins: [
    VueRouter({}),
    vue(),
    Components({ resolvers: [HeadlessUiResolver()] }),
    AutoImport({
      imports: ['vue', '@vueuse/head', VueRouterAutoImports],
    }),
  ],
  server: {
    open: true,
    // 添加代理配置
    proxy: {
      '/api': {
        target: process.env.VUE_APP_API_URL,
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '') // 移除路径中的/api前缀
      }
    }
  },
})

如果使用代理,建议将api.js的baseURL改为'/api',避免代码中硬编码后端地址:

import axios from 'axios';

const api = axios.create({ 
  baseURL: '/api' 
});

export default api;

3. 重启Vite服务

修改.env文件或Vite配置后,必须重启Vite开发服务器,否则新配置不会生效。

4. 验证环境变量加载

可以在组件中添加日志确认环境变量是否正确加载:

console.log('API URL:', process.env.VUE_APP_API_URL);

额外注意

你的后端接口实际地址是http://127.0.0.1:8000/user/projects,而.env中配置的是localhost:8000,虽然本地环境下两者等价,但如果出现解析问题,可以将.env中的地址改为http://127.0.0.1:8000。

内容的提问来源于stack exchange,提问作者Hugo Pedro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:51:32