许多在线服务将其网络配置为使用 CDN(内容交付网络),通过允许从地理位置相近的位置提供内容来提高性能。我注意到 CDN 经常使用与实际服务不同的域名提供服务。
例如,访问www.amazon.com将涉及从 media-amazon.com 提取内容。
www.facebook.com从 fbcdn.com 获取内容,等等。
我的问题是,为什么这些服务不使用子域名,而是使用完全不同的域名作为 CDN?
例如,为什么不使用 cdn.facebook.com 而不是 fbcdn.com?我很少看到有人这样做。它几乎总是一个不同的域名,通常是在基本域名上添加一些内容,或者是缩写。
我唯一能想到的是,拥有不同的域名允许使用不同的 DNS 提供商来分散 DNS 负载,但情况并非总是如此。
这种做法是否有特定的技术原因?如果有,原因是什么?
澄清:我并不关心域名注册的成本。我认为任何大量使用 CDN 的公司都能负担得起一些额外的域名。我的问题是,从技术角度来看,为什么使用子域名会比使用单独的域名更差。这种做法如此普遍,表明这样做是有充分理由的。
答案1
虽然每个提供商都不同,做出相同选择的原因也不同,但这样做的一个常见原因是饼干。
如果您的网站使用 Cookie,并且您的 Cookie 可能需要用于多个子域,那么您最终会随每个 CDN 请求一起发送 Cookie。这会导致两个问题:
- 如果您有大量 Cookie 和/或非常大的 Cookie,那么您将显著扩大对 CDN 的每个请求,毫无理由地占用宝贵的带宽(因为 CDN 向所有人提供相同的内容)。在 Google、Facebook、Amazon 等公司的规模下,请求中的每个字节都很重要,因为数百万(甚至数十亿)个请求会迅速增加。
- 如果您的 Cookie 包含用户数据,您可能不希望 CDN 能够看到这些数据。如果您的 CDN 实际上全部或部分由第三方服务提供商托管,情况尤其如此。不向 CDN 发送 Cookie 可消除一种可能攻击用户数据的途径。
另一个常见原因是用户生成内容。Gmail 附件和托管在 GitHub 存储库中的代码就是很好的例子。如果用户生成的内容托管在子域上,则可能能够阻止 Cookies、LocalStorage 等获取用户的信息并将其发送给第三方。托管在不同的域上可以减轻这种形式的攻击。
答案2
这个问题的答案只能是猜测。一种可能的可能性是 -
不同的团队/构建系统处理 CDN 和应用程序。通过分离域而不是使用子域,可以简化管理和自动化,并减少出现故障的可能性。从整体上看,域名的成本微不足道。