我有主站点(site.com)和我的资源(css、images、js)所在的站点(somecdn.com)。我想在登录之前推送一些这些资源。我发送 ajax 请求并在响应头中设置 Link-s 与资源。但是我的资源下载等待并且没有任何推送(见附图)。如何为 somecdn.com 中的资源启用 http2 推送? 有推 无推我在 docker 中创建了两个站点:site.com 和 somecdn.com 并检查 http2 push 是否在这两个站点上正常工作(并且分别按预期工作)。https://127.0.0.1:8081/index.php<!doctype html><html><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title></head><body> <h1>IndexPHP</h1></iframe>--> <script> window.onload = function () { var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://127.0.0.1:8083/push.php', true); xhr.send(); } </script></body></html>https://127.0.0.1:8083/push.php<?phpheader("Link: </style.css>; rel=preload; as=style", false);header("Link: </image.png>; rel=preload; as=image", false);我希望无需等待即可在 Chrome 开发工具资源中看到“推送”指示。
1 回答

喵喵时光机
TA贡献1846条经验 获得超7个赞
不,不可能为另一个域推送资源。来自HTTP/2 规范:
服务器必须在 ":authority" 伪头字段中包含一个值,服务器对其具有权威性(参见第 10.1 节)。客户端必须将服务器不具有权威性的 PUSH_PROMISE 视为 PROTOCOL_ERROR 类型的流错误(第 5.4.2 节)。
您可以使用这些标头预加载请求,这会给浏览器提示以高优先级获取它们,甚至在它稍后看到对资源的实际请求之前。
事实上,许多人无论如何都推荐预加载而不是推送,因为推送非常复杂,没有缓存感知,因此很容易被过度推送滥用,从而导致性能损失,因此它的好处值得怀疑。这就是HTTP/2 推送的使用率仍然如此之低的原因。
在 HTTP/2 下通常不鼓励使用像这样的分片域,因为它失去了 HTTP/2 的许多优点,HTTP/2 旨在出于性能原因转移到单个连接。有关此问题的详细解释,请参阅此博客文章:https : //csswizardry.com/2019/05/self-host-your-static-assets/
- 1 回答
- 0 关注
- 170 浏览
添加回答
举报
0/150
提交
取消