是否可以在不同域之间进行 http2 推送资产?

我有主站点(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


<?php


header("Link: </style.css>; rel=preload; as=style", false);

header("Link: </image.png>; rel=preload; as=image", false);

我希望无需等待即可在 Chrome 开发工具资源中看到“推送”指示。


qq_花开花谢_0
浏览 208回答 1
1回答

喵喵时光机

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