代理服务器也合并请求?
浏览器对 GET 请求的处理是有合并机制的,即使同时打开多个网页,只要是针对同一个资源的 GET 请求并且没有命中 Vary 头字段的差异都可以共享这个资源。也就是说,同时打开 10 个页面,这个页面上请求了一个 10MB 的图片,那么实际上对这个图片的请求只会发起一次。只有第一次访问是真正的发起,后续的访问都只是共享了第一次的成功结果而已。如果第一次请求是失败的则所有请求都失败掉。
这个逻辑是没问题的,在 HTTP 中除非指明 Vary 头字段,否则字段的差异不会被认为是资源的差异。无论是用户代理还是服务代理都可以使用这个机制。
虽然 nginx 并没有实现这个逻辑,但一些其它更专业的 HTTP 代理和缓存服务器上是有这个逻辑的,比如 varnish。
似乎国内的 CDN 很少会用 varnish,大家都使用了奇奇怪怪的技术来实现,导致了各家 CDN 的差异巨大。也许大家都只是拿 CDN 做「静态资源加速」,所以不会纠结太多细节的实现差异。如果需要依赖 CDN 的细节特性来实现某些东西就会踩到无数多的坑。