从 CDN 获取 jquery.min.js 或其他资源时,CDN 是否知道客户端正在访问哪个网站?

Does CDN know which website the client is visiting when fetching jquery.min.js or other resource from CDN?

CDN 能否通过跟踪我网站的访问者或他们下载所需的库而不共享他们访问的页面的 URL 来创建某种统计信息?

是的,他们可以使用 referer header 字段:

The HTTP referer (originally a misspelling of referrer) is an HTTP header field that identifies the address of the webpage (i.e. the URI or IRI) that linked to the resource being requested. By checking the referrer, the new webpage can see where the request originated.

该字段是请求 header 的一部分,可能看起来像这样,例如,重新加载此页面将显示此 link 到 googleapis(请参阅控制台 F12 和网络选项卡):

http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js

发送了这个请求header:

Host: ajax.googleapis.com
User-Agent: Mozilla/5.0 (...)
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://whosebug.com/questions/30743915/does-cdn-know-which-website-the-client-is-visiting-when-fetching-jquery-min-js-o
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

使用 referer 报告它来自哪个站点:

Referer: http://whosebug.com/questions/30743915/does-cdn-know-which-website-the-client-is-visiting-when-fetching-jquery-min-js-o

是的,他们知道请求资源的页面的 URL(例如,通过查看 Referer header)。因此他们可以跟踪哪些网站请求了特定资源。唯一的例外是当 HTTPS 页面通过 non-secure 连接请求资源时。在那种情况下,Referer 将不会被设置,但是 Origin header 可能会有一些帮助。

当然可以跟踪个人用户,但由于多种原因这是不切实际的:

  1. CDN 资源被浏览器大量缓存,因此它们将被请求并为许多不同的页面浏览一次下载,从而使 "passive" 统计信息虚假。

  2. 强制用户为访问的每个页面下载资源会使 CDN 毫无意义,无缘无故地减慢导航速度并使 CDN 的带宽过载。这是 90 年代 GeoCities 页面上 long-dead 浏览量计数器使用的技术(叹息)。

  3. 跟踪用户至少需要设置一个识别cookie。这增加了 Web 服务的复杂性(因为它不再是一个简单的文件服务器)和响应时间的延迟,因为 UID 必须在某种形式的数据库中查找或新生成。 Etags 也可能被滥用,cookie 也有同样的问题。

  4. 作为替代方案,使用查询字符串参数可以工作,但需要目标页面的协作,目标页面必须将 UID 作为每个请求的参数,这意味着 URLs不能是 hard-coded。我猜你说的不是这种情况。

综上所述,CDN 可以 跟踪您的访问者,但这样做的缺点实际上大于假设的收益,假设性能和相关的盈利能力是主要的运行 CDN 的目标。如果分析比性能或运营经济更有价值,就像免费 CDN 一样,那么可以通过应用第 2 点和第 3 点来牺牲性能来获得洞察力。

到那时,人们必须证明所收集统计数据的可靠性,以便能够出于任何营销目的出售它们。此外,通常由 CDN 提供的文件的性质使它们变得非常无趣。例如,我认为了解有多少人使用特定版本的 jQuery 并不能带来多少收益。

<meta name="referrer" content="same-origin"> 在这种情况下,不会将引荐来源网址发送到 CDN