CORB OPTIONS 请求在 Chrome 73 中被阻止

CORB OPTIONS Requests Blocked in Chrome 73

似乎在最近的 Chrome 版本中,(或者至少最近在调用我的 API --- 直到今天才看到它),Google正在发出有关 CORB 请求被阻止的警告。

Cross-Origin Read Blocking (CORB) blocked cross-origin response [domain] with MIME type text/plain. See https://www.chromestatus.com/feature/5629709824032768 for more details.

我已确定对我的 API 的请求成功了,并且是 pre-flight OPTIONS 请求在控制台中触发了警告。

正在调用 API 的应用程序并未明确发出 OPTIONS 请求,而是我了解到这是浏览器在发出 cross-origin 请求时强制执行的并且是自动完成的通过浏览器。

我可以确认 OPTIONS 请求响应没有定义 mime-type。但是,我有点困惑,因为据我了解,OPTIONS 响应仅为 headers,并且不包含 body。我不明白为什么这样的请求需要定义 mime-type。

此外,控制台警告说请求被阻止;然而各种 POST 和 GET 请求都成功了。所以看起来好像 OPTIONS 请求实际上并没有被阻止?

这是一个 three-part 问题:

  1. 当没有 body 响应时,为什么 OPTIONS 请求需要定义 mime-type?
  2. 如果 plain/text 不合适,OPTIONS 请求的 mime-type 应该是什么?我会假设 application/json 是正确的吗?
  3. 如何配置我的 Apache2 服务器以包含一个 mime-type 用于所有 pre-flight OPTIONS 请求?

我已经弄清楚了这些 CORB 警告。

这个问题部分与我使用 content-type-options: nosniff header 有关。我设置此 header 是为了阻止浏览器尝试嗅探 content-type 本身,从而消除 mime-type 欺骗,即使用 user-uploaded 文件作为攻击媒介。

另一部分与返回的 content-type 有关 application/json;charset=utf-8。根据 Google 的文档,它指出:

A response served with a "X-Content-Type-Options: nosniff" response header and an incorrect "Content-Type" response header, may be blocked.

基于此,我开始仔细检查 IANA's site on acceptable media types. To my surprise, I discovered that no charset parameter was ever actually defined in any RFC for the application/json 类型,并进一步说明:

No "charset" parameter is defined for this registration. Adding one really has no effect on compliant recipients.

基于此,我从 content-type 中删除了字符集:application/json 并且可以确认在 Chrome.

中停止的 CORB 警告

总而言之,根据最近的 Chrome 发布,Google 已选择开始比过去更严格地对待 mime-type。

最后,作为旁注,我们所有应用程序请求仍然成功的原因是因为 Cross-Origin Read Blocking isnt actually enforced in Chrome:

In most cases, the blocked response should not affect the web page's behavior and the CORB error message can be safely ignored.

遇到了同样的问题。

我遇到的问题是由于 API 使用 200 OK 响应预检,但在没有设置 Content-Length header 的情况下是一个空响应。

因此,将预检响应状态更改为 204 No Content 或通过简单地设置 Content-Length: 0 header 解决了问题。