【问题标题】:Is it possible to http2 push assets among different domains?是否可以在不同域之间进行 http2 推送资产?
【发布时间】:2020-01-07 00:55:03
【问题描述】:

我有主站点(site.com)和我的资源(css、图像、js)所在的站点(somecdn.com)。我想在登录之前推送一些这样的资源。我发送 ajax 请求并在响应头中设置 Link-s 与资源。但是我的资源在等待并且没有任何推送的情况下下载(见附图)。如何在 somecdn.com 中启用 http2 推送资源? with push without push

我在 docker 中创建了两个站点:site.com 和 somecdn.com,并检查 http2 push 在它们上是否正常工作(并且分别按预期工作)。

https://127.0.0.1:8081/index.php

<!doctype html>
<html lang="en">
<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 开发工具资源中查看。

【问题讨论】:

    标签: php nginx push http2


    【解决方案1】:

    不,不能为另一个域推送资源。来自HTTP/2 spec

    服务器必须在 ":authority" 伪标头中包含一个值 服务器对其具有权威性的字段(参见第 10.1 节)。一种 客户端必须处理服务器不处理的 PUSH_PROMISE 权威作为类型的流错误(第 5.4.2 节) PROTOCOL_ERROR。

    您可以使用这些标头预加载请求,这将提示浏览器以高优先级获取它们,甚至在它稍后看到对资源的​​实际请求之前。

    事实上,很多人都推荐预加载而不是推送,就像push is very complex,不知道缓存,所以很容易被过度推送滥用,从而导致性能损失,因此它的好处是值得怀疑的。这就是为什么usage of HTTP/2 push remains so low

    在 HTTP/2 下通常不鼓励使用像这样的分片域,因为它失去了 HTTP/2 的许多好处,HTTP/2 旨在出于性能原因移动到单个连接。有关此问题的详细说明,请参阅此博客文章:https://csswizardry.com/2019/05/self-host-your-static-assets/

    【讨论】:

    • 谢谢!但是解决方法呢?例如,从 cdn 添加 iframe 似乎可以解决问题。
    • 解决方法是使用预加载,而不是推送。或者自托管。我不明白如何从 CDN 添加 iframe 来解决这个问题 - 你能解释一下你的意思吗?
    • 对不起,我的错!只是检查一下。是的,推送正在工作,但是当页面需要这种资源情况时重复
    • 我不明白这是什么意思。现在解决了吗?如果是,请接受答案。
    • 我接受你的回答,谢谢!由于缺乏声誉,无法投票:(
    猜你喜欢
    • 2016-07-07
    • 2018-04-05
    • 2017-12-13
    • 2018-12-02
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多