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