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

Google Chrome中使用JavaScript fetch时GET方法自动转为OPTIONS的问题

解决GET请求自动转为OPTIONS的跨域问题

这个问题其实是CORS预检请求在搞鬼,我来帮你拆解下原因和可行的解决办法:

为什么会出现这种情况?

当你的请求包含自定义HTTP头部(比如你代码里的Authorization),Chrome等浏览器会先自动发送一次OPTIONS预检请求,用来确认目标服务器是否允许这种带自定义头部的跨域请求。而Safari的预检缓存机制和Chrome略有不同,所以不会出现这个问题;偶尔刷新页面能正常发GET,是因为浏览器缓存了之前的预检结果,直接跳过了OPTIONS步骤。

具体解决步骤

1. 确保服务器正确处理OPTIONS请求

这是核心问题,服务器必须在OPTIONS请求的响应中返回正确的CORS头部,示例需要包含的头部如下:

Access-Control-Allow-Origin: 你的前端域名(比如http://localhost:3000,不能用*如果请求带Authorization)
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Authorization
Access-Control-Max-Age: 86400  # 设置预检结果缓存1天,减少重复OPTIONS请求

只有服务器返回这些头部,浏览器才会继续发送后续的GET请求。

2. 检查前端请求的细节

  • 你的代码里'Bearer' + token少了个空格!正确的格式应该是'Bearer ' + token(Bearer后面必须加空格),这个小错误可能导致服务器无法识别Authorization头部,进而出现预检通过但GET请求无数据的情况。修改后的代码:
    fetch(BaseURL + type, { 
      method: 'GET', 
      headers: { 'Authorization': 'Bearer ' + token } 
    })
    
  • 确认BaseURL + type拼接后的API地址和前端页面域名确实存在跨域情况(不同域名/端口/协议),如果是同域请求不会触发预检。

3. 额外排查点

  • 打开浏览器开发者工具的Network面板,查看OPTIONS请求的响应头部,确认是否包含了上面提到的CORS头;如果有缺失,需要调整服务器配置。
  • 如果是开发环境,检查是否使用了代理工具(比如Webpack Dev Server的proxy),确保代理正确转发了OPTIONS请求到后端服务器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:02:26