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

配置http-proxy-middleware后,Axios请求Express仍触发OPTIONS预请求?

React调用Express后端仍触发OPTIONS预请求的原因与解决办法

为什么会触发OPTIONS预请求?

浏览器的同源策略规定,只有简单请求才会跳过OPTIONS预校验,你的请求不符合简单请求的判定条件,所以浏览器自动发起OPTIONS:

  • 你在Axios请求头中添加了Access-Control-Allow-Origin: *,这个是服务端返回给客户端的响应头,客户端请求时携带它属于自定义请求头,直接触发预请求;
  • 请求的Content-Type为application/json,不在简单请求允许的Content-Type范围内(仅允许application/x-www-form-urlencoded、multipart/form-data、text/plain),这也会触发预请求;
  • 若Axios的BASE_URL直接写http://localhost:8000而非/api,则代理配置未生效,请求仍为跨域请求,必然触发OPTIONS。

你的配置问题

  1. Axios实例的headers中无需设置Access-Control-Allow-Origin,该头由服务端返回,客户端携带属于冗余操作,还会触发预请求;
  2. 若BASE_URL未设为/api,代理未生效,跨域问题持续存在。

如何避免OPTIONS预请求?

分两种场景处理:

场景1:可改为简单请求

  • 移除Axios配置中的Access-Control-Allow-Origin请求头;
  • 将Content-Type改为application/x-www-form-urlencoded,同时用qs.stringify()处理请求体(需先安装qs包);
  • 确保Axios的BASE_URL为/api,让代理生效,此时请求被转发到后端,不存在跨域,浏览器不会发起OPTIONS。

修改后的Axios示例:

const qs = require('qs');
const options = {
    baseURL: '/api', // 确保是/api而非直接后端地址
    timeout: 300000,
    withCredentials: false,
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
    },
    transformRequest: [function (data) {
        return qs.stringify(data);
    }],
};
const axiosInstance = axios.create(options);

场景2:必须使用application/json

这种情况下,OPTIONS预请求是浏览器同源策略的强制要求,无法避免。不过你的后端CORS配置已经能正确处理OPTIONS请求,预请求不会影响业务逻辑,无需刻意消除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:15:47