据我所知,HTTP/2 可以通过单个连接发送网站资产(图像、脚本、css 文件等),也可以推送它们。我很想知道这在实践中是如何实现的。
通用服务器(例如 Apache 或 nginx)如何决定发送什么?具体来说,我理解理论上服务器可以推送它知道将被请求的数据,但它如何知道要发送什么?
例如,假设您有一个配置了 index.php 脚本的 Web 服务器(Apache 或 nginx),该脚本会生成一个页面和一些资产。Web 服务器是否会自动解析 index.php 的输出并将所有必需的文件与响应一起发送?还是 index.php 文件需要以某种方式指定这一点?
或者是虽然理论上可能,但实际上不会发生,而浏览器只是稍后才请求资产?
答案1
这完全取决于服务器以及它的配置方式。
大多数服务器都不够智能,不知道要推送什么,这取决于配置。因此,您可以设置配置,以说明如果index.html
请求任何文件,则推送common.css
和common.js
。然后,重要的是考虑下一个访问的页面 - 无需再次推送这些文件,因为用户应该已经拥有它们。您可以使用基于 cookie 的方法来跟踪这一点。请参阅我的帖子在这里如何在 Apache 中配置此功能。一些服务器(例如 Apache)还维护该连接的已知推送资产列表,以避免过度推送,尽管这只适用于相同的连接,因此基于 cookie 的方法更好。
许多服务器和 CDN 可以使用 HTTPlink
标头来通知 Web 服务器要推送哪些资产。这样,控制权就落到了后端应用服务器上,但推送却发生在边缘 Web 服务器上,因此无需在 Web 服务器上进行所有明确配置。
其他服务器尝试在这方面变得更加智能,并尝试根据观察请求来猜测要推送什么资源。Jetty 有工具可以做到这一点例如。我无法证明其准确性和实用性。
或者是虽然理论上可能,但实际上不会发生,而浏览器只是稍后才请求资产?
虽然推动是可能的(我的博客就是这么做的,如上文所示),但推动确实存在问题。过度推动确实存在风险,即使没有这样做,其好处也从未得到证实。此外,实施问题和复杂性也需要考虑。所以现实情况是它并不常用。从我去年完成的一项研究约有 0.5% 的网站使用了 HTTP/2 推送。Chrome 已经声明正在考虑关闭对 HTTP/2 推送的支持. 请谨慎使用。