Vite 代理下的 POST 请求跨域问题排查与解决方案

embedded/2025/2/12 21:14:12/

📌 问题描述

Vite 开发环境中,我遇到了一个奇怪的现象:

  • GET 请求可以成功返回数据
  • POST 请求却返回 403 Forbidden: Invalid CORS request
  • 但如果我手动使用 fetch 直接请求服务器 API,POST 请求可以成功

我的 Vite 代理配置如下:

server: {proxy: {'/api': {target: 'https://www.example.cn',changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '/api/back')}}
}

axios 中的 POST 请求:

request.post({ url: '/queryRealTimeData' })

最终 POST 请求失败,并在控制台看到:

403 Forbidden: Invalid CORS request

🔍 排查过程

1️⃣ 直接测试服务器 API

为了确认后端 API 是否工作正常,我手动使用 fetch 在本地 HTML 文件中调用 API:

const response = await fetch("https://www.example.cn/api/back/query",{method: "POST",headers: { "Content-Type": "application/json" },body: JSON.stringify({})}
);

请求成功!这说明后端 API 本身没有问题。


2️⃣ 检查 Vite 代理的 POST 请求

我打开 Network 面板,查看 Vite 代理的 POST 请求,发现:

  • 请求的 Originhttp://localhost:4000
  • 服务器的 CORS 规则仅允许 http://127.0.0.1:5500
  • 浏览器在 POST 之前会先发送 OPTIONS 预检请求,而这个请求被拒绝了

为了确认 OPTIONS 是否真的被拒绝,我手动执行:

curl -X OPTIONS -H "Origin: http://localhost:4000" \-H "Access-Control-Request-Method: POST" \-H "Access-Control-Request-Headers: Content-Type" \https://www.liontry.cn/api/back/moon/queryRealTimeData -v

返回:

403 Forbidden: Invalid CORS request

确认问题:后端的 CORS 规则不允许 localhost:4000,但允许 127.0.0.1:5500,所以 Vite 代理的请求失败!


3️⃣ 解决方案

✅ 方案 1:伪装 Origin

由于后端只允许 127.0.0.1:5500,但 Vite 运行在 localhost:4000,我修改 Vite 代理,在 headers 里手动伪装 Origin

server: {proxy: {'/api': {target: 'https://www.example.cn',changeOrigin: true,secure: false,headers: {Origin: 'http://127.0.0.1:5500' // 伪装成被允许的 Origin},rewrite: (path) => path.replace(/^\/api/, '/api/back')}}
}

修改后,POST 请求成功!


✅ 方案 2:让后端允许 localhost:4000

如果后端可修改,最好的办法是让后端 CORS 规则允许 localhost:4000

Access-Control-Allow-Origin: http://127.0.0.1:5500, http://localhost:4000
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type

📌 这样,无论是 fetch 还是 Vite 代理的 axios,都能正常请求!


🎯 总结

问题原因解决方案
GET 请求成功,但 POST 失败POST 触发 OPTIONS 预检,后端 CORS 限制了 Origin让后端允许 localhost:4000,或在 Vite 代理中伪装 Origin
fetch 请求成功,Vite 代理的 POST 失败fetch 直接请求 127.0.0.1:5500,Vite 代理使用 localhost:4000在 Vite 代理 headers 里伪装 Origin
CORS 报错 Invalid CORS request后端不允许 localhost:4000 作为 Origin让后端添加 localhost:4000Access-Control-Allow-Origin

💡 最终,我通过在 Vite 代理中伪装 Origin 解决了 POST 请求的跨域问题! 🚀


http://www.ppmy.cn/embedded/161693.html

相关文章

AI大模型随机初始化权重并打印网络结构方法(以Deepseekv3为例,单机可跑)

背景 当前大模型的权重加载和调用,主要是通过在HuggingFace官网下载并使用transformer的库来加以实现;其中大模型的权重文件较大(部分>100GB),若只是快速研究网络结构和数据流变化,则无需下载权重。本文…

【开源项目】数字孪生武汉~超经典智慧城市CIM/BIM数字孪生可视化项目——开源工程及源码

飞渡科技数字孪生武汉CIM管理平台,基于自研数字孪生引擎,结合数字孪生、物联网IOT、云计算等信息技术,以城市数据资源融合共享为主线,打造感知、联结、计算、运用“四位一体”的城市大脑,赋能经济社会高质量可持续发展…

亚马逊数据采集API教程:如何使用Pangolin Scrape API高效获取Amazon商品数据

为什么需要专业的Amazon Scrape API? 亚马逊是全球最大的电子商务平台之一,商家和数据分析师需要实时获取商品数据以优化业务决策。然而,由于亚马逊的严格反爬机制,传统的爬虫方法面临诸多挑战: 反爬机制复杂&#xff…

荣耀手机Magic3系列、Magic4系列、Magic5系列、Magic6系列、Magic7系列详情对比以及最新二手价格预测

目录 荣耀Magic系列手机详细对比 最新二手价格预测 性价比分析 总结 以下是荣耀Magic系列手机的详细对比以及最新二手价格预测: 荣耀Magic系列手机详细对比 特性荣耀Magic3系列荣耀Magic4系列荣耀Magic5系列荣耀Magic6系列荣耀Magic7系列处理器骁龙888&#x…

【开源免费】基于SpringBoot+Vue.JS社区养老服务平台(JAVA毕业设计)

本文项目编号 T 190 ,文末自助获取源码 \color{red}{T190,文末自助获取源码} T190,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

ffmpeg -formats

1. ffmpeg -formats -loglevel quiet 显示ffmpeg支持的格式 2. 输出 选取部分输出结果 File formats: D. Demuxing supported .E Muxing supported -- D aac raw ADTS AAC (Advanced Audio Coding) E mov QuickTime / MOV D mov,mp4,m4a,3gp,3g2,mj2 QuickTime / MOV…

JUnit 5 TestInstanceFactory 功能与使用详解

JUnit 5 TestInstanceFactory 功能与使用详解 TestInstanceFactory 是 JUnit 5 的扩展接口,允许开发者自定义测试类实例的创建逻辑。默认情况下,JUnit 会为每个测试方法创建一个新的测试类实例(PER_METHOD 模式),但通…

使用STM32F103C8T6和ESP8266链接阿里云

一、项目简介 基于 STM32F103C8T6 单片机和 ESP8266 Wi-Fi 模块,旨在实现通过 Wi-Fi 连接阿里云物联网平台,进行数据上传和远程控制 STM32F103C8T6:作为核心控制单元,负责系统的运算、数据处理和与外设的交互。STM32F103C8T6 具有…