禁用跨域的 HTTP/2 連接重用
連接
$$ … $$可以對具有多個不同 URI 權限組件的請求重用$$ … $$只要源伺服器是權威的$$ … $$.
因此,例如,如果同一個源伺服器可以為 foo.example.com 和 bar.example.com 提供服務,那麼客戶端可以重用一個連接來向兩個目的地發出請求。如果不希望這樣做,同一部分會說
不希望客戶端重用連接的伺服器可以通過發送 421(錯誤定向請求)狀態程式碼來響應請求來表明它對請求不具有權威性
$$ … $$.
這可能會在一些意外情況下出現,例如當使用虛擬伺服器並且它們的 TLS 配置不同但它們使用萬用字元或主題替代名稱共享證書時。
不幸的是,最終結果是一個或多個額外的往返:客戶端樂觀地重用連接,伺服器拒絕請求,然後客戶端必須打開一個新連接並重試。在最壞的情況下,這可能與僅使用 HTTP/1.1 連接而不重用一樣糟糕,甚至更糟糕。當同一個源伺服器共享許多不同的目的地並由同一個客戶端搜尋時,這似乎變得特別糟糕,因為每次打開一個新連接以響應 421 時,客戶端仍然覺得它可以重用該連接,並且因此 421 的發生頻率幾乎與有用的響應一樣頻繁。
假設根本問題是棘手的,或者至少發送 421 響應的條件超出了伺服器管理員的控制範圍,但它會發生的事實是已知的,有沒有辦法提前通知客戶端不要重用跨域連接?這仍然保留了 HTTP/2 連接重用的主要好處,即對同一域的多個請求可以在單個連接上進行多路復用,同時還避免了可預見的 421 響應。
核選項是簡單地將需要特殊配置的伺服器放在單獨的 IP 地址上,這樣瀏覽器就不能重用連接。如果該站點旨在可訪問 Internet,則它必須是單獨的全域IP 地址,而不是本地網路中的單獨 RFC1918 地址。
您似乎認為 421 錯誤超出了伺服器管理員的控制範圍。這不是真的。發生這種情況完全是由於伺服器管理員的配置選擇。
如果您不希望發生這種情況,請使用不同的 TLS 證書以及您希望不共享 HTTP/2 連接的名稱的不同 TLS 配置。因為該連接只能用於該 TLS 證書上的名稱,所以不匹配意味著客戶端必須打開一個新連接。