【问题标题】:CORS preflight not happening consistentlyCORS 预检没有持续发生
【发布时间】:2016-10-10 12:45:39
【问题描述】:

我发现 CORS 有一些奇怪的地方,我正在尝试确认它是错误还是什么...

基本上,我有一个网站,www.example.com,它向 log.example.com 发出许多 POST 请求以进行日志记录。由于 log.example.com 是不同的域,因此 CORS 有效。

在大多数情况下,我会看到一个预检 OPTIONS 请求,然后是 POST 请求。但是,在某些情况下,我只看到 POST,没有前面的 OPTIONS - 基本上是这样的:

OPTIONS
POST
...intervening requests to www...
OPTIONS
POST
POST
...intervening requests to www...
POST
...intervening requests to www...
OPTIONS
POST

任何 OPTIONS 请求都不会返回 Access-Control-Max-Age 标头(它们可能应该返回,但这是另一回事),因此浏览器不应缓存 OPTIONS 响应。所有 OPTIONS 请求都返回 200,所有 POSTS 都返回 202。有时有中间请求,有时没有。所有 OPTIONS 请求都传递完全相同的标头,并且响应返回完全相同的 Access-Control-* 响应标头组合。 POST 请求也是如此。

我没有(轻松)访问发出 POST 请求的 JS(我的意思是,我可能找到它,但它被混淆了),但我不这么认为应该有所作为 - 我很确定它们只是基本的 ole' XHR 请求。

fetch spec来看,如果没有通过Access-Control-Max-Age,即使在预检缓存中添加了一个条目,也应该立即将其驱逐。还是因为第二个 POST 发生在第一个 POST 的一秒内(在 OPTIONS 请求之后),所以预检缓存中有一个未过期的条目?

【问题讨论】:

  • 您是否知道那些跳过 OPTIONS 的请求是否来自不同的 UA/浏览器引擎,或者您是否只从一个 UA 看到了这种模式?因为听起来它可能只是一个浏览器错误。
  • @sideshowbarker,我只在 Chrome (51.0.2704.79 m) 上看到过这个 - 我还没有在其他浏览器上测试过。我知道 CORS 测试套件非常广泛,所以我怀疑存在时间错误。从获取规范(5.8)中:“在存储条目后,在 max-age 字段中指定的秒数过后,必须从 [从 CORS 预检缓存中] 删除条目。”即使未通过 max-age ,看起来条目可能总是被添加到缓存中(5.7.7.15 和 5.7.7.17)。即使名义上它们是“立即”从缓存中删除的,但它们在缓存中的时间可能足以进行第二次 POST?
  • 这个运气好吗?即使我面临同样的问题,昨天我的一个休息 api 工作正常,显示 POST 200,现在它的 OPTIONS 200 没有响应,我添加了带有响应 Access-Control-Allow-Origin 的标题

标签: cors


【解决方案1】:

并非所有 POST 请求都经过预检(POST 是一种 CORS 安全列表方法)。这取决于请求中包含的标头。因此,如果没有任何标头超出 CORS 安全列表的请求标头范围,您将不会获得预检。

【讨论】:

  • 嘿 Anne,我想你可能会回应 :) 所有 POST 请求都完全相同,标头方面,它们都包括 Content-Type: application/json,它不是 CORS 安全列表request-header (虽然我认为它可能应该是:)...奇怪的是有些预检和一些没有,我看不出它们之间有任何区别,除了有效负载本身(只有一点点不同)。
  • 虽然这个问题很老了,但对于其他有同样问题的人来说,还是值得一提的。我认为 OPTIONS(飞行前)请求可能已被您的浏览器缓存。此缓存由以下参数强制执行:Access-Control-Max-Age (developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…)。因此缓存过期可能是这里的原因。
猜你喜欢
  • 2017-05-18
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 2022-07-18
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多