【发布时间】:2019-09-01 08:03:46
【问题描述】:
似乎在最近的 Chrome 版本中(或者至少最近在调用我的 API 时 --- 直到今天才看到它),Google 正在发出有关 CORB 请求被阻止的警告。
跨域读取阻止 (CORB) 阻止了 MIME 类型为 text/plain 的跨域响应 [域]。详情请见https://www.chromestatus.com/feature/5629709824032768。
我已确定对我的 API 的请求是成功的,并且是飞行前 OPTIONS 请求触发了控制台中的警告。
调用 API 的应用程序并没有显式地发出 OPTIONS 请求,而是我了解到这是在发出跨域请求时由浏览器强制执行的,并且由浏览器自动完成。
我可以确认 OPTIONS 请求响应没有定义 mime 类型。但是,我有点困惑,因为我的理解是 OPTIONS 响应只是标题,不包含正文。我不明白为什么这样的请求需要定义 MIME 类型。
此外,控制台警告说请求被阻止;然而,各种 POST 和 GET 请求都成功了。所以看起来 OPTIONS 请求实际上并没有被阻止?
这是一个由三部分组成的问题:
- 当没有正文响应时,为什么 OPTIONS 请求需要定义 mime 类型?
- 如果纯文本/文本不合适,OPTIONS 请求的 MIME 类型应该是什么?我会假设 application/json 是正确的吗?
- 如何将我的 Apache2 服务器配置为包含所有飞行前 OPTIONS 请求的 mime 类型?
【问题讨论】:
-
OPTIONS 预检正在成功。如果它失败了,浏览器会停在那里并且永远不会继续尝试你的 POST 请求。您看到 POST 请求的事实表明预检成功。 OPTIONS 请求不需要定义 mime 类型。问题中没有任何迹象表明您有任何 CORS 问题。相反,您遇到了 CORB 问题。问题中引用的错误消息表明您的代码正在获取 text/plain 响应,但代码试图在浏览器不希望使用 text/plain 的某些上下文中使用该响应。
-
如果您更新问题以添加前端代码的 sn-p 以显示您如何发出请求以及如何使用响应,您可能会在此处获得更好的帮助。例如,您可能会收到 CORB 错误,因为您的代码正试图将该文本/纯文本响应解析为 JSON。
-
正确,正如我所指出的,OPTIONS 请求成功,因为 POST 请求成功。您也是正确的,因为我也认为 OPTIONS 请求不需要 mime 类型,但 Chrome 似乎认为它需要?您说我没有 CORS 问题也是正确的,我的问题与 CORS 无关,因此我没有提出来。正如您在示例 POST 响应中看到的那样,我正在返回适当的 mime 类型——Chrome 中的警告与 OPTIONS 请求有关,该请求没有 mime 类型(因为我相信它不需要)。我开始相信这是 Chrome 中的一个错误。
标签: google-chrome cors apache2 cross-origin-read-blocking