【发布时间】: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