为啥将您的 Javascript 文件移动到您也拥有的不同主域?
Posted
技术标签:
【中文标题】为啥将您的 Javascript 文件移动到您也拥有的不同主域?【英文标题】:Why move your Javascript files to a different main domain that you also own?为什么将您的 Javascript 文件移动到您也拥有的不同主域? 【发布时间】:2010-09-14 16:38:45 【问题描述】:我注意到,就在过去一年左右的时间里,许多主要网站都对其网页结构进行了相同的更改。每个人都将他们的 javascript 文件从托管在与页面本身(或其子域)相同的域上移至托管在不同名称的域上。
不仅仅是并行化
现在,有一种众所周知的技术可以将您的网页组件分布到多个域以并行下载。 Yahoo recommends it 和其他许多人一样。例如,www.example.com 是托管 html 的位置,然后您将图像放在 images.example.com 上,将 javascripts 放在 scripts.example.com 上。这绕过了这样一个事实,即大多数浏览器都会限制每台服务器的同时连接数,以便成为优秀的网民。
以上内容不是我在说什么。
这不仅仅是重定向到内容交付网络(或者可能是——见问题底部)
我所说的是专门在完全不同的域上托管 Javascript。让我具体一点。就在去年左右,我注意到:
youtube.com 已将其 .JS 文件移至 ytimg.com
cnn.com 已将其 .JS 文件移至 cdn.turner.com
weather.com 已将其 .JS 文件移至 j.imwx.com
现在,我知道像 Akamai 这样专门为大型网站外包此内容的内容交付网络。 (Turner 的特殊领域中的名称“cdn”让我们了解这个概念在这里的重要性)。
但请注意这些示例,每个站点都有自己为此目的专门注册的域,而不是内容交付网络或其他基础设施提供商的域。事实上,如果您尝试从这些脚本域中的大多数加载主页,它们通常会重定向回公司的主域。如果您反向查找所涉及的 IP,它们有时似乎指向 CDN 公司的服务器,有时则不是。
我为什么要关心?
曾在两家不同的安全公司工作过,我对恶意 Javascript 感到偏执。
因此,我遵循将允许 Javascript(和其他活动内容,如 Java)在其上运行的网站列入白名单的做法。因此,要使 cnn.com 这样的网站正常运行,我必须手动将 cnn.com 放入列表中。这是一个痛苦的背后,但我更喜欢它而不是替代方案。
当人们使用 scripts.cnn.com 之类的东西进行并行化时,使用适当的通配符可以正常工作。当人们使用 CDN 公司域之外的子域时,我可以只允许 CDN 公司的主域在前面加上一个通配符,然后用一块石头杀死许多鸟(例如 *.edgesuite.net 和 *.akamai.com)。
现在我发现(截至 2008 年)这还不够。现在我必须在我想列入白名单的页面的源代码中四处寻找,并找出该站点用于存储其 Javascript 的“秘密”域(或域)。在某些情况下,我发现我必须允许三个不同的域才能使网站正常工作。
为什么所有这些主要网站都开始这样做?
编辑:好的as "onebyone" pointed out,它似乎与内容的 CDN 交付有关。所以让我根据他的研究稍微修改一下这个问题......
为什么 weather.com 使用 j.imwx.com 而不是 twc.vo.llnwd.net?
为什么 youtube.com 使用 s.ytimg.com 而不是 static.cache.l.google.com?
这背后有一个原因。
【问题讨论】:
【参考方案1】:大约两到三年前,我在以前的雇主那里实施了这个解决方案,当时网站由于旧版 Web 服务器实施而开始出现过载。通过将 CSS 和布局图像移至 Apache 服务器,我们减少了主服务器上的负载并提高了速度。
但是,我一直认为 Javascript 函数只能从与页面本身相同的域中访问。较新的网站似乎没有此限制:正如您所提到的,许多网站在单独的子域甚至完全独立的域上都有 Javascript 文件。
谁能告诉我为什么现在可以做到这一点,而不是几年前?
【讨论】:
我也想知道这个;相同的来源政策似乎很难在不同的域上托管您的 Javascript。但是有很多方法可以欺骗它(元标记等),现在很常见吗?【参考方案2】:我曾与一家这样做的公司合作过。他们位于具有相当好的对等互连的数据中心中,因此 CDN 推理对他们来说并不那么重要(也许这会有所帮助,但他们不会因此而这样做)。他们的原因是他们并行运行多个网络服务器,共同处理他们的动态页面(php 脚本),并且他们从一个单独的域中提供图像和一些 javascript,在该域上他们使用快速、轻量级的网络服务器(例如 lighttpd 或 thttpd)来提供服务图片和静态 javascript。
PHP 需要 PHP。静态 Javascript 和图像没有。当您需要做的只是绝对最低限度时,可以从功能齐全的网络服务器中剥离很多东西。
当然,他们可能会使用代理将请求重定向到特定子目录到不同的服务器,但使用不同的服务器处理所有静态内容会更容易。
【讨论】:
【参考方案3】:您的后续问题本质上是:假设一个受欢迎的网站使用 CDN,为什么他们会使用自己的 TLD,例如 imwx.com,而不是子域 (static.weather.com) 或 CDN 的域?
嗯,使用他们控制的域而不是 CDN 的域的原因是他们保留了控制权——他们甚至可以完全更改 CDN,只需要更改 DNS 记录,而不是必须更新 1000 页面中的链接/应用程序。
那么,为什么要使用无意义的域名呢?嗯,像 .js 和 .css 这样的帮助文件的一个重要问题是您希望它们尽可能多地被代理和人们的浏览器缓存到下游。如果一个人点击 gmail.com 并且所有的 .js 都从他们的浏览器缓存中加载出来,那么该站点对他们来说似乎更加快捷,并且它还节省了服务器端的带宽(每个人都赢了)。问题是,一旦您发送 HTTP 标头进行真正激进的缓存(即缓存我一周或一年或永远),这些文件将不再可靠地从服务器加载,您无法更改/修复他们,因为人们的浏览器会出现问题。
因此,公司必须做的是进行这些更改并实际更改所有这些文件的 URL,以强制人们的浏览器重新加载它们。循环浏览“a.imwx.com”、“b.imwx.com”等域就是这样做的。
通过使用无意义的域名,Javascript 开发人员及其 Javascript 系统管理员/CDN 联络员可以拥有自己的域名/DNS,他们正在推动这些更改,他们负责/自主。
然后,如果 TLD 上开始发生任何类型的 cookie 阻止或脚本阻止,它们只会从一个无意义的 TLD 更改为 kyxmlek.com 或其他任何东西。他们不必担心会意外做出对所有 *.google.com 产生反制副作用的邪恶行为。
【讨论】:
很棒的答案。现在很有意义! 谢谢...其中一些是由广告网络开创的,他们处理了大量的图像阻止、cookie 阻止等。我运行我的一个浏览器并使用您的“全部拒绝,白名单一些“配置,这样我就可以看到他们在做什么 - 这是一个巨大的 PITA 访问页面并且必须将 15 个域列入白名单! (这是他们想要的,他们希望人们放弃并接受所有图像/cookie等,因此他们的跨域跟踪将起作用。这就是“邪恶”的一些晦涩/复杂性的原因。) 不知道为什么这个答案被接受,这只是猜测。当他们想要更新他们的静态内容时,他们会更改 url 而不是主机。 url 通常包含内容的哈希值。所以对于 file.css 它可能会变成 file.c54d567.css 然后当内容发生变化时,哈希会发生变化,因此 url 会发生变化,并且浏览器将获取一个新的。没有人使用更改域来更新内容。他们拥有不同域的原因与cookie有关。【参考方案4】:原因很多:
CDN - 不同的 dns 名称可以更轻松地将静态资产转移到内容分发网络
并行性 - 图像、样式表和静态 javascript 使用另外两个不会阻塞其他请求的连接,例如 ajax 回调或动态图像
Cookie 流量 - 完全正确 - 特别是对于习惯于在 cookie 中存储的不仅仅是简单会话 ID 的网站
负载调整 - 即使没有 CDN,仍然有充分的理由将静态资产托管在更少的 Web 服务器上,这些服务器经过优化以极快地响应大量文件 url 请求,而网站的其余部分托管在更大的数量上响应更多处理器密集型动态请求的服务器
更新 - 您不使用 CDN 的 dns 名称的两个原因。客户端 dns 名称充当 CDN 正在缓存的资产的正确“蜂巢”的关键。此外,由于您的 CDN 是一种商品服务,您可以通过更改 dns 记录来更改提供程序 - 这样您就可以避免在您的网站上进行任何页面更改、重新配置或重新部署。
【讨论】:
【参考方案5】:如果我是一家知名的多品牌公司,我认为这种方法会很有意义,因为您希望将 javascript 代码作为库提供。我想让尽可能多的页面在处理地址、州名、邮政编码等内容时尽可能保持一致。 AJAX 可能会突出这一问题。
在当前的互联网商业模式中,域名是品牌,而不是网络名称。如果你被收购或分拆品牌,你最终会发生很多域名变化。即使是最知名的网站,这也是一个问题。
在 *.netscape.com 和 *.mcom.com 中仍有指向有用文档的链接早已不复存在。
Netscape 的***说:
“2004 年 10 月 12 日,流行的开发者网站 Netscape DevEdge 被 AOL 关闭。DevEdge 是 Internet 相关技术的重要资源,维护着 Netscape 浏览器的权威文档、HTML 和 JavaScript 等相关技术的文档,以及由 Danny Goodman 等行业和技术领导者撰写的热门文章。DevEdge 的一些内容已在 Mozilla 网站上重新发布。”
所以,在不到 10 年的时间内:
马赛克通信公司 网景通信公司 美国在线 美国在线时代华纳 时代华纳如果您将代码放在一个不是品牌名称的域中,您将保留很大的灵活性,并且您不必在重新构建网站时重构所有入口点、访问控制和代码引用命名。
【讨论】:
【参考方案6】:会不会是因为垃圾邮件和内容过滤器的拦截?如果他们使用奇怪的域,那么就很难弄清楚和/或你最终会阻止你想要的东西。
不知道,只是一个想法。
【讨论】:
【参考方案7】:我认为 CDN 理论中有些东西:
例如:
$ host j.imwx.com
j.imwx.com CNAME twc.vo.llnwd.net
twc.vo.llnwd.net A 87.248.211.218
twc.vo.llnwd.net A 87.248.211.219
$ whois llnwd.net
<snip ...>
Registrant:
Limelight Networks Inc.
2220 W. 14th Street
Tempe, Arizona 85281-6945
United States
Limelight 是一个 CDN。
同时:
$ host s.ytimg.com
s.ytimg.com CNAME static.cache.l.google.com
static.cache.l.google.com A 74.125.100.97
我猜这是 Google 内部运行的静态内容 CDN。
$ host cdn.turner.com
cdn.turner.com A record currently not present
啊,好吧,赢不了。
顺便说一句,如果您使用带有 NoScript 插件的 Firefox,那么它将自动搜索源代码,并通过 GUI 处理白名单的过程。基本上,单击状态栏中的 NoScript 图标,您将获得一个域列表,其中包含临时或永久白名单选项,包括“所有在此页面上”。
【讨论】:
【参考方案8】:我想你回答了你自己的问题。
我认为您的问题与安全有关,而不是为什么。
也许一个新的 META 标记是为了描述相关页面的有效 CDN,那么我们只需要一个浏览器插件来读取它们并做出相应的行为。
【讨论】:
对不起,我没有得到你的第一点。我是如何回答自己的问题的?【参考方案9】:您可以移动到不同域的不仅仅是 javascript,而且尽可能多的资产会产生性能改进。
大多数浏览器对您可以与单个域建立的同时连接数有限制(我认为大约是 4 个),因此当您有很多图像、js、css 等时,通常会在下载每个文件时遇到问题.
您可以使用 YSlow 和 FireBug 之类的工具来查看从服务器下载每个文件的时间。
通过将资产放在不同的域中,您可以减轻主域的负载,并且可以同时建立更多连接并在任何给定时间下载更多文件。
我们最近推出了一个房地产网站,该网站有很多图片(房屋的,duh :P),它使用这个原理来制作图片,因此列出数据要快得多。
我们还在许多其他具有高资产量的网站上使用了它。
【讨论】:
是的,我已经在并行化部分的问题中探讨了这种可能性。但这并不能解释为什么 youtube.com 例如使用 ytimg.com 而不是 assets.youtube.com。 每个 HTTP 1.1 对每个主机有两个连接限制——是的,为服务于静态资产的主机创建名称 DNS 别名可以真正加快页面加载时间,尤其是对于缩略图之类的内容.【参考方案10】:限制 cookie 流量?
在特定域上设置 cookie 后,对该域的每个请求都会将 cookie 发送回服务器。每一个请求!
这可以很快加起来。
【讨论】:
正确设置 cookie 域不能解决这个问题吗? IE。如果您将 cookie 绑定到 www.cnn.com(而不是 cnn.com),那么它不会被发送到 scripts.cnn.com。 这是应该标记为正确的答案。至于他们为什么不使用子域,是因为他们可能希望其他子域访问它。例如,video.cnn.com 需要访问 cnn.com cookie。他们不能将 cookie 限制在 www.cnn.com。以上是关于为啥将您的 Javascript 文件移动到您也拥有的不同主域?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 我们的网站(www.t0001.com)在UC导航里不会显示图标的 我有设置了favicon.ico