caching - Safari 不会跨域缓存资源

标签 caching safari browser-cache cdn google-cdn

假设我们有几个不同的网站:website1.com、website2.com、website3.com。我们对所有这些都使用 jQuery,并将其从 CDN(如 googleapis.com)中包含在内。浏览器的预期行为是将其缓存一次并将其用于所有其他网站。 Chrome 似乎做到了,但 Safari 会为每个域下载 jQuery。

例子

  • 使用下面给定的 JS 代码打开 nytimes.com , bbc.comdw.de在 Chrome 。
  • 在第一个网站上附加 jQuery,然后查看 DevTools 的 Network 选项卡。它会说它得到了 jQuery。
  • 现在打开任何其他网站并再次附加 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.comc.com可以追踪到这是同一个人。

    Safari 会阻止这种行为。如 b.coma.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/

    相关文章:

    caching - 当我通过 FTP 更新文件时,文件没有改变

    android - volley imageCache 和 imageRequest 都缓存图像

    ios - iOS Safari 上的 GZIP 压缩总是 1.00 倍?

    html - 所有浏览器(包括Chrome)编辑后不会刷新页面的.css文件!解决办法是什么?

    python - 检查缓存是否过时的算法

    javascript - 将缓存设置为 Firebase 存储中的文件

    css - Safari 渲染由 scaleX 缩放的内联 block 的问题

    javascript - 为什么 Safari 会复制 GET 请求而 Chrome 不会?

    php - 如何从我的站点缓存脚本和图像?

    javascript - 从 URL 请求 javascript 中的纯文本文件?