网络服务器如何知道在 HTTP/2 请求中要发送哪些文件?

网络服务器如何知道在 HTTP/2 请求中要发送哪些文件?

据我所知,HTTP/2 可以通过单个连接发送网站资产(图像、脚本、css 文件等),也可以推送它们。我很想知道这在实践中是如何实现的。

通用服务器(例如 Apache 或 nginx)如何决定发送什么?具体来说,我理解理论上服务器可以推送它知道将被请求的数据,但它如何知道要发送什么?

例如,假设您有一个配置了 index.php 脚本的 Web 服务器(Apache 或 nginx),该脚本会生成一个页面和一些资产。Web 服务器是否会自动解析 index.php 的输出并将所有必需的文件与响应一起发送?还是 index.php 文件需要以某种方式指定这一点?

或者是虽然理论上可能,但实际上不会发生,而浏览器只是稍后才请求资产?

答案1

这完全取决于服务器以及它的配置方式。

大多数服务器都不够智能,不知道要推送什么,这取决于配置。因此,您可以设置配置,以说明如果index.html请求任何文件,则推送common.csscommon.js。然后,重要的是考虑下一个访问的页面 - 无需再次推送这些文件,因为用户应该已经拥有它们。您可以使用基于 cookie 的方法来跟踪这一点。请参阅我的帖子在这里如何在 Apache 中配置此功能。一些服务器(例如 Apache)还维护该连接的已知推送资产列表,以避免过度推送,尽管这只适用于相同的连接,因此基于 cookie 的方法更好。

许多服务器和 CDN 可以使用 HTTPlink标头来通知 Web 服务器要推送哪些资产。这样,控制权就落到了后端应用服务器上,但推送却发生在边缘 Web 服务器上,因此无需在 Web 服务器上进行所有明确配置。

其他服务器尝试在这方面变得更加智能,并尝试根据观察请求来猜测要推送什么资源。Jetty 有工具可以做到这一点例如。我无法证明其准确性和实用性。

或者是虽然理论上可能,但实际上不会发生,而浏览器只是稍后才请求资产?

虽然推动是可能的(我的博客就是这么做的,如上文所示),但推动确实存在问题。过度推动确实存在风险,即使没有这样做,其好处也从未得到证实。此外,实施问题和复杂性也需要考虑。所以现实情况是它并不常用。从我去年完成的一项研究约有 0.5% 的网站使用了 HTTP/2 推送。Chrome 已经声明正在考虑关闭对 HTTP/2 推送的支持. 请谨慎使用。

相关内容