假设我们有几个不同的网站:website1.com、website2.com、website3.com。我们对所有这些都使用 jQuery,并将其从 CDN(如 googleapis.com)中包含在内。浏览器的预期行为是将其缓存一次并将其用于所有其他网站。 Chrome 似乎做到了,但 Safari 会为每个域下载 jQuery。
例子
然而,Safari 会说它正在为每个域加载 jQuery,但尝试打开其中一个域上的任何网页并再次附加脚本——你会看到现在它说它从缓存中获取了 jQuery。所以看起来它缓存了一个域的数据,即使它已经从另一个域的确切 URL 下载了资源。
这个假设是否正确,如果正确,如何解决?
您可以复制/粘贴的代码:
setTimeout(function() {
var SCRIPT_SRC = '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js';
var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = SCRIPT_SRC;
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
}, 0);
UPD:使用静态图像对其进行测试。
test.com、test2.com 和 test3.com 有
<img src="http://image.com/image.jpg" />
.在所有浏览器中,除了 Safari 访问日志只显示一个 - 第一个 - 对图像的请求。 Safari 获取每个新域(但不是子域)的图像。
最佳答案
我也注意到了这一点,我怀疑这是出于隐私原因。
默认情况下,Safari 会阻止 third-party cookies .第三方 cookie 是在 b.com
上设置的 cookie。用于 a.com
请求的资源.例如,这可用于跨域跟踪人员。你可以在 b.com
上有一个脚本由 a.com
请求来自 c.com
. b.com
可以基于第三方 cookie 在此脚本中插入唯一的客户端 ID,以便 a.com
和 c.com
可以追踪到这是同一个人。
Safari 会阻止这种行为。如 b.com
为 a.com
请求的资源设置 cookie , Safari 会将该 cookie 装箱,因此它只会发送到 b.com
更多请求来自 a.com
.不会发送到b.com
来自 c.com
的请求.
现在进入缓存,特别是 Etag
标题。安 Etag
是一个任意字符串(通常是文件的哈希值),可用于确定请求的资源自上次请求以来是否已更改。这通常是一件好事。如果它没有改变,它会保存重新发送整个文件。
但是,因为 Etag
是任意字符串,b.com
可以将其设置为包含客户端 ID。这叫做Etag tracking .它允许以与 cookie 几乎完全相同的方式跨域跟踪一个人。
摘要:通过不跨域共享缓存,Safari 保护您免受跨域 Etag 跟踪。
关于caching - Safari 不会跨域缓存资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24616625/