为什么我的简单请求还会被CORS拦截?

新利🍀 阅读 3

我在本地开发一个前端页面,用 fetch 向公司内网的一个 API 发起 GET 请求,明明没带自定义 header,也没用 JSON body,按理说是 simple request,应该不会触发 preflight 才对。但浏览器控制台还是报 CORS 错误,说缺少 Access-Control-Allow-Origin。

我试过加 credentials: ‘include’,也试过换不同的 Content-Type,都不行。后端同事说他们没改配置,之前是可以的。是我哪里理解错了吗?

<script>
  fetch('http://192.168.1.100:8080/api/status', {
    method: 'GET',
    headers: {
      'Accept': 'application/json'
    }
  })
  .then(res => res.json())
  .then(console.log);
</script>
我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
设计师博泽
按照规范,虽然你的请求方法是 GET,而且没有自定义的复杂 header,但你设置的 Accept: application/json 这个 header 实际上会影响简单请求的判断。简单请求只允许一些特定的 header,像 Accept-Language 或者 Content-Type 为 application/x-www-form-urlencoded 这种。

这里的问题在于后端没正确处理 CORS。你需要让后端同事在响应中加入 Access-Control-Allow-Origin 头部字段,并且要匹配前端的来源,或者用 来允许所有来源(当然生产环境不推荐这样做)。如果需要带 credentials 的话,这个头部不能用 而是要明确指定源。

可以试试把代码暂时改成这样来验证问题:

fetch('http://192.168.1.100:8080/api/status', {
method: 'GET',
headers: {
'Accept': 'text/plain' // 先改成简单的类型试试
}
})
.then(res => res.json())
.then(console.log);


不过这只是临时测试,真正解决问题还得靠后端配置。有时候明明之前没问题,可能是有代理或者中间件缓存了旧的配置导致的。记得跟后端确认他们服务器的真实响应头。
点赞
2026-03-27 19:00