![使用 SPDY 推送,遥远的未来过期标头还有什么意义吗?](https://linux22.com/image/619414/%E4%BD%BF%E7%94%A8%20SPDY%20%E6%8E%A8%E9%80%81%EF%BC%8C%E9%81%A5%E8%BF%9C%E7%9A%84%E6%9C%AA%E6%9D%A5%E8%BF%87%E6%9C%9F%E6%A0%87%E5%A4%B4%E8%BF%98%E6%9C%89%E4%BB%80%E4%B9%88%E6%84%8F%E4%B9%89%E5%90%97%EF%BC%9F.png)
据我了解,在 SPDY 推送中,服务器提供一个 HTML 文档,在发送之前查看它,并决定我需要图像/css 资源 XY 和 Z,因此也将它们发送过去。
如果它们已经被我的浏览器缓存了,它怎么知道不需要再去缓存它们呢?或者说,如果你的客户端使用的是 spdy/3 浏览器,那么尝试缓存静态资源基本上是没有意义的吗?
(显然不是每个客户都会这样,但我对这个案例很感兴趣)
答案1
根据 Chromium 开发者网站上的资源,这是缺点之一。服务器无法知道客户端是否已经拥有该资源,因此这可能是一次浪费的传输。
来源:http://www.chromium.org/spdy/link-headers-and-server-hint
答案2
如果您确实需要优化首页加载时间:
- 生成首次页面加载期间所需的所有 bootstrap 静态文件的签名(md5/sha 哈希的子字符串)。这通常只是 bootstrap 的基本 css + js。从那时起,通常 js 会加载内容(特别是客户端丰富的应用程序,因此您不需要服务器推送,客户端将适当地重用缓存)
- 设置一个长期存在的 cookie“bootstrap-version”,并将其设置为引导版本签名。
当客户端请求页面时:
- 如果引导版本 cookie 不是最新的或者不存在,则启动引导文件的服务器推送。
- 否则,假设客户端已缓存它们(可能不会,导致小幅回归,但 99% 的情况下都会)
这样,您将获得非常高的效率,并且首页加载将有效地看起来像由于服务器推送而导致的带有缓存的重复访问。
Go 和 node spdy 实现允许您使用服务器推送。据我所知,nginx/apache 模块还没有此功能。我希望他们能很快根据应用程序提供的标头或类似内容添加它。