簡體   English   中英

http2是否可以在不同域之間推送資產?

[英]Is it possible to http2 push assets among different domains?

我有主站點(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 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開發者工具資源中看到它們,而無需等待並且帶有“推送”指示。

不,不可能將資源推送到另一個域。 根據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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM