簡體   English   中英

HTTP / 2服務器推送不起作用,我在做什么錯?

[英]HTTP/2 Server Push not working, what am I doing wrong?

這是我的第一個問題,希望我做對了。

我正在使用帶有HTTP / 2(共享主機提供程序)的LiteSpeed Web服務器,但無法使用推送功能。 我不太確定如何檢查它是否有效,但至少據我所知它不能正常工作。

因此,我查閱了很多指南(例如HTTP / 2 Server Push教程HTTP / 2 Server Push 的綜合指南 ),它們都提到通過添加以下內容來更改標頭:

link: </my/theme/css/style.css>; rel=preload; as=style

我知道這段代碼告訴服務器預加載所述資源,在本例中為style.css。 但是,如果服務器支持HTTP / 2推送,則它應該自動推送資源(只要您不在其末尾添加nopush)。 第二個鏈接確實提到對於大多數服務器(但不是所有服務器)都適用。

因此,考慮到這一點,我創建了一個簡單的測試PHP頁面,以查看是否可以正常運行。 結果是這樣的:

Chrome DevTools顯示帶有鏈接預加載的“標題”標簽

DevTools中的“網絡”選項卡顯示結果

因此,我看到的大多數指南都提到,“推送”資源的“網絡”選項卡中的“啟動器”將表示“ 推送/其他” (而不是“ Other”) ,但是從我的結果中可以看到,它只是說“ Other”。 更不用說該資源不會在同一請求中加載,對我而言,這就像一個簡單的預加載。 我還使用https://http2.pro/check測試了我的網站,它說沒有資源被推送。

已使用Chrome 71.0.3578.98進行了測試。

  • 我在這里錯過了重要的事情嗎? 我的服務器可能有問題嗎?
  • 另一個問題。 在標頭中為預加載和推送定義多個資源時,一些指南提到創建多個鏈接元素,而另一些指南則提到用逗號將它們分隔為單個鏈接元素。 兩者都是正確的,一個比另一個好嗎?

感謝您的任何幫助或啟發!

因此,在通過各種配置,瀏覽器版本和Chrome中啟用/禁用的標記進行測試以及通過網絡事件查看器進行調查之后,可能會有一些事情。

如果LiteSpeed Web服務器已啟用QUIC,則Chrome v71似乎將請求顯示為普通的GET請求,並且不會指示該請求已被推送,但是在Chrome的網絡事件查看器中查看時,它表明確實已將其推送(查找QUIC_SESSION_PUSH_PROMISE_RECEIVED)。

現在,只有在啟用瀏覽器中的QUIC的情況下,情況才會如此,據我所知,Chrome v71當前不是默認情況(它們會不時禁用和啟用)-所以您要么必須在Chrome中設置一個標記才能啟用QUIC,並且您會看到上述行為(您還應該在Web開發人員工具下的“協議”中看到http/2+quic/43 )。

如果未在瀏覽器或Web服務器上啟用QUIC,則應該看到正在推送的文件,Chrome v71會使用啟動程序“推/其他”指示這一點。

現在,在Chrome v73(Canary版本)中,它將“啟動器”設置為“ Other ,“大小”應為(from memory cache) ,這表明文件已被推送。

在Google Chrome瀏覽器中,您可以轉到chrome:// net-export /,然后單擊“開始將日志記錄到磁盤”,然后刷新瀏覽器窗口,在該窗口中,您有要推送的文件-停止測量,然后轉到https:/ /netlog-viewer.appspot.com/-在此處導入json文件,然后轉到“ QUIC”,在列表中找到您的域名,然后單擊“連接ID”。

然后,單擊列表中的“ QUIC_SESSION”,並搜索QUIC_SESSION_PUSH_PROMISE_RECEIVED如果存在匹配項,則知道文件已被推送。

要弄清楚是否當前已推送它有點麻煩,而這種困惑主要與Chrome Dev Tools協議和版本之間的不一致有關。

首先,您需要確定您的基礎架構是否使用Link標頭來激活推送。 Litespeed文檔在這里似乎不太好,但是讓我們假設這是激活推送的方式。

接下來是檢查您的服務器是否正在發送推送的請求。 我發現nghttp是執行此操作的最佳工具,因此,如果您也可以訪問此命令,請運行類似的命令以查看HTTP / 2框架,以及是否發送了PUSH_PROMISE框架,表明正在推送樣式表:

nghttp -anv https://www.example.com

您也可以使用Chrome瀏覽器查看框架,盡管它們使難度增加很多,但堅持先記錄到磁盤然后在查看器中打開。 請遵循與@LucasRolff的答案類似的說明,但要使用HTTP / 2或此處

假設服務器正在推送資源,那么您接下來要了解的是Chrome為什么不使用該推送資源。 最常見的原因是,如果您使用自簽名TLS證書來提供瀏覽器無法識別的HTTPS。 即使您點擊錯誤並獲得帶有紅色掛鎖的連接,Chrome也不會對該連接使用緩存,因此無法使用HTTP / 2推送 (這需要使用HTTP / 2推送緩存)。 如果是這種情況,應該顯示nghttp或Chrome事件日志輸出。 或者,嘗試使用Firefox,如果單擊了無法識別的證書,則確實允許使用HTTP / 2推送。

最后是您的最后一個問題:

在標頭中為預加載和推送定義多個資源時,一些指南提到創建多個鏈接元素,而另一些指南則提到用逗號將它們分隔為單個鏈接元素。 兩者都是正確的,一個比另一個好嗎?

兩者都是正確的。 HTTP(無論是HTTP / 1.1還是HTTP / 2)定義了以下內容:

header1: value1
header1: value2

和這個:

header1: value1, value2

語法上相同

接收者可以通過將每個隨后的字段值按順序附加到合並的字段值上並用逗號分隔,將多個具有相同字段名的頭字段組合成一對“字段名:字段值”,而無需更改消息的語義。逗號。

暫無
暫無

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

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