nginx/1.18.0(Ubuntu)
我想使用服务器推送技术。
nginx.conf
location = /push/ {
http2_push https://slabaya.ru/1/css/style.css;
}
html
<html>
<head>
<link rel="stylesheet" href="https://slabaya.ru/1/css/style.css">
</head>
<body>
<p>Test</p>
</body>
</html>
结果:不起作用。
https://c.radikal.ru/c21/2105/84/50598f04e294.png
https://d.radikal.ru/d32/2105/ba/7e5d2cf6e02a.png
从图片中可以看出,Chrome 和 Webpagetest 都没有表明 css 文件被推送。
你能帮我解决这个问题吗?
答案1
您的location
阻止仅适用于 URL http://slabaya.ry/push/
URL。
然而,HTTP/2 推送并不容易正确实现,这就是它将从 Chromium(Chrome 和许多其他浏览器的基本代码库)中删除的原因。
HTTP/2 推送的问题是,有时客户端已经拥有了上一次页面加载的资源,你需要有条件地实现推送。这并不容易做到。
如果我是你,我不会费心尝试实现推送。工作量太大,收获甚微。
如果您仍想修复配置,则需要将http2_push
指令移到块之外location
。
答案2
您只能从提供请求的域进行推送。
在您的示例中,文档由一个域提供,而样式表由另一个域提供。
因此,文档无法“推送”样式表,因为它不拥有该样式表。它需要获取样式表然后推送它,但即使这是可能的(但事实并非如此,您只能推送相对路径源),域也会发生变化,因此不会与文档 HTML 中引用的域相同,因此无论如何它都必须请求该域。
我同意 Tero 所说的一切,关于推送很困难,收益值得怀疑,并且已经声明它将从 Chrome 中删除。