我注意到许多网站都将其资源托管在与主网站不同的域中,例如使用sstatic.net的StackExchange,使用imagesbn.com等的Barnes&Noble,等等。

我知道将静态资源放在单独的主机上是有好处的,也许可以使用像这样的高效静态文件Web服务器nginx,释放了主服务器以专注于提供动态内容。同样,将外包给像Cloudfront Akamai这样的共享CDN也是合乎逻辑的。为什么用sstatic.net而不是static.stackexchange.com?

更新:几个答案都错过了核心问题。我知道在多个主机之间进行拆分(并行下载,更瘦的Web服务器等)是有好处的。但是,更难理解的是为什么要使用多个域。为什么以sstatic.net而不是static.stackexchange.com作为共享资源的主机?到目前为止,只有一个答案可以解决这个问题。

#1 楼

许多站点都设置了很多cookie,这些cookie的目的是支持某种状态。

通过将静态(无状态)资源放在完全不同的域上,可以减小http请求。在某些情况下,有太多的cookie,以至于单个http请求需要两个TCP数据包进行传输。因此,拥有一个单独的域是减少请求页面各个部分的数据包数量的方法之一。

其他具有相同目标的方法是将大量图像合并为一个sprite,并将所有Javascript合并为一个文件。

评论


仅从www.example.com服务您的网站,这样Cookie会针对该域而不是TLD进行存储,然后将CDN放在static.example.com等其他子域上会更好吗?

– Tullo_x86
19/12/26在19:37



在许多情况下,网站已经分为shop.example.com和login.example.com之类的部分。我还看到有些情况,诸如analytics.example.com之类的东西实际上是针对分析型SaaS的CNAME。因此,他们通常希望在这些单独的主机名之间共享状态,并将要共享的cookie放在域.example.com上。如果您不希望任何cookie进入静态资源,那么您确实需要一个完全独立的域。

–尼尔斯·巴斯吉斯(Niels Basjes)
19/12/26在21:50

似乎对于像login.www.example.com这样的子域实际上存在有效的情况。真丑我明白了为什么人们只使用另一个域。

– Tullo_x86
20年1月6日在20:21

#2 楼

除了使用CDN之外,对静态数据使用单独的域还意味着:


您可以使用轻型Web服务器,而该Web服务器不必加载动态内容的所有模块/扩展。 Web服务器必须在每个单个请求上加载。不必扫描URI路径中的每个目录以读取.htaccess文件,也可以增加服务器可以处理的并发请求数量。
添加额外的子域意味着您可以增加浏览器可以执行的并行下载数量。 br />如果设置正确(例如,您的网站托管在www.example.com而不是example.com上),您还可以利用无cookie子域,从而减少流量和往返时间。

唯一的缺点是,如果如果您使用的是SSL会话,则需要签名证书并为其他域使用单独的静态IP。但是,在大多数情况下,这样做带来的好处多于轻微的麻烦。

编辑:

对不起,我误解了您的问题。如果您问为什么有些人使用单独的SLD,则可以通过#3的括号来回答。 sstatic.net上也对此进行了说明:


如果您的域是www.example.org,则可以在static.example.org上托管静态组件
。但是,如果您已经在
顶级域名example.org而非www.example.org上设置了cookie,则对static.example.org的所有请求都将包含这些cookie。在这种情况下,您可以购买一个全新的域,在其中托管静态组件
,并使该域保持无Cookie状态。雅虎!使用yimg.com,YouTube
使用ytimg.com,亚马逊使用images-amazon.com等。


但化身也提到了使用单独的通用名称的好处当您运行共享某些资产的大型站点网络时,SLD而不是现有SLD的子域。

最后,正如Niels Basjes指出的,消除Cookie的部分原因是为了最大程度地减少用于执行请求的数据包数量。我认为YSlow准则指出大多数网络的最大数据包大小为1500字节,因此将其保持在1500字节以下将减少TCP开销。这也证明了使用sstatic.net代替static.webmasters.stackexchange.com的另一个优点。

评论


为什么需要一个单独的IP?

– Mihalis Bagos
2012年1月26日上午10:01

因为传统上加密是在发送域名之前应用的。减轻这种情况的SNI尚未得到普遍支持-您将在XP上排除IE。

– phihag
2012年1月26日12:28



@Mihalis:只需添加到phihag的评论中,您还可以排除Windows Mobile 6.5和更早版本,Android 2.x和更早版本,Blackberry Browser,XP上的Safari ...支持的/不支持的软件的完整列表可以在此处找到:en.wikipedia.org/wiki/Server_Name_Indication#No_support

–Lèsemajesté
2012年1月26日19:24



我不是在问为什么要使用多个子域-这对我来说很有意义。我要问的是单独的完整域。为什么选择sstatic.net而不是static.stackexchange.com?

– Michael Ekstrand
2012年1月26日21:16

#3 楼

Lèsemajesté涵盖了要点,但要进一步扩展,我要补充说,为所有各种Stack Exchange网站拥有一个域意味着浏览它们的人只会下载一次静态内容,例如JavaScript。例如,进入超级用户后,用户将使用缓存的内容,因为它来自同一位置。

有关Yahoo和Google的一些有用信息。

#4 楼

主要原因是cookie。 Niels在他的回答中建议的只是一个很小的后果,而不是真正的原因。如果没有Cookie,则请求大小会较小,因此可以节省一些带宽。

,真正的区别在于浏览器缓存。由于内容是静态的(即不变),因此浏览器可以将其缓存在本地硬盘上,并且避免每次都从Internet加载文件。 Web服务器只发送304条回复,而不是发送整个文件,这意味着内容没有更改。

当站点使用cookie时,浏览器会认为文件的内容对于不同的用户可能会有所不同,因此不要缓存那些文件。从无cookie的域提供文件可确保浏览器缓存正常工作。

这是主要原因,因为它可以缩短加载时间并显着减少带宽。

#5 楼

较旧的浏览器每个主机名只能进行两次并行下载。

跨多个域拆分网页的元素称为域分片。这样做可以并行下载更多资源,从而减少总的页面加载时间。

分片的最佳域数是2-4。在4个域之后,响应时间会降低。