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

如何解决Vite代理在后端返回302重定向时路径缺失/api前缀的问题

Vite代理后端302重定向缺失/api前缀导致404的解决方案

问题背景

当前Vite代理配置如下,将带/api前缀的请求转发至后端服务http://localhost:8000,同时重写路径去掉/api前缀:

server: {
    port: 4200,
    host: 'localhost',
    proxy: {
      '/api': {
        target: 'http://localhost:8000',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, ''),
      },
    },
  },

但后端返回302重定向响应时,返回的Location URL不含/api前缀,前端直接跳转该URL后,因匹配不到Vite代理规则而出现404错误。

现有解决方案(需后端配合)

你已通过添加自定义请求头proxy-prefix: /api,让后端在生成302重定向URL时主动拼接该前缀,配置如下:

proxy: {
  '/api': {
    target: 'http://localhost:8000',
    changeOrigin: true,
    headers: {"proxy-prefix": "/api"},
    rewrite: (path) => path.replace(/^\/api/, ''),
  },
},

该方案可行,但需要后端代码做对应修改,增加了前后端的耦合度。

更优解决方案(前端代理层处理,无需后端改动)

利用Vite代理基于http-proxy的特性,通过onProxyRes钩子拦截后端响应,自动给302重定向的Location URL添加/api前缀:

配置示例

server: {
  port: 4200,
  host: 'localhost',
  proxy: {
    '/api': {
      target: 'http://localhost:8000',
      changeOrigin: true,
      rewrite: (path) => path.replace(/^\/api/, ''),
      // 拦截并修改后端响应头
      onProxyRes(proxyRes, req, res) {
        const location = proxyRes.headers['location'];
        // 仅处理302重定向的情况
        if (location && proxyRes.statusCode === 302) {
          // 处理相对路径的重定向URL
          if (!location.startsWith('http')) {
            proxyRes.headers['location'] = '/api' + location;
          } else {
            // 处理完整URL形式的重定向(提取路径和参数部分)
            const urlObj = new URL(location);
            proxyRes.headers['location'] = '/api' + urlObj.pathname + urlObj.search;
          }
        }
      }
    },
  },
},

方案优势

  • 无需修改任何后端代码,所有逻辑在前端代理层完成,保持前后端解耦;
  • 自动适配相对路径和完整URL两种形式的重定向地址;
  • 不影响其他类型的响应,仅针对302重定向做处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:42:24