421 錯誤的請求
我偶爾會收到以下 421 錯誤:
被誤導的請求
客戶端需要為此請求建立新連接,因為請求的主機名與用於此連接的伺服器名稱指示 (SNI) 不匹配。
但是,刷新瀏覽器會清除錯誤並正常載入頁面。下次載入頁面時不會產生錯誤,因此模式看起來很隨機。我能看到的唯一模式是,當我使用 header(“Location: " . $url); 重定向頁面時,可能會發生這種情況。
我有一個來自 Comodo 的 PositiveSSL 多域證書。我的伺服器是共享 Web 託管服務上的 Apache,因此我無權訪問配置。
我從一個域載入頁面,頁面內是證書上第二個域的連結。
我讀到的有關此錯誤的所有內容似乎都表明此問題與多域證書有關。
我想知道的是,網頁(php)編碼方面是否有任何東西可能導致這種情況(並且可以修復),或者它是否是配置錯誤或可能是伺服器錯誤,只有我的託管服務可以修理它。
到目前為止,我的託管服務無法提供任何東西,並要求在接下來發生的確切時間回電,以便他們進行研究。任何幫助將不勝感激,因為我不太相信他們能解決這個問題。
更新 好吧,差不多幾年後,決定是時候處理它了。通過刪除提供圖像和 javascript 的靜態域,我能夠解決大部分問題。但是,我仍在為其中的一些內容使用第二個域,特別是 Safari 仍然給我帶來了問題。
我做了更多的研究,並在這裡看到了另一篇談論它的文章。正是@Kevin 所描述的。文章證實它發生在 Safari 中。因此,接受了建議,我著手為每個域獲取單獨的證書。我在一個共享主機(Webhostinghub)上,發現他們現在提供自動更新的免費 SSL(AutoSSL)。聽起來不錯。他們為我設置了 5 個免費證書。到現在為止還挺好。我什至可以嘗試重新啟用靜態域進行測試。如果這一切正常,我將節省 $ 啟動作為獎勵,並讓我的 Comodo 證書在 7 月到期。
這是由以下事件序列引起的:
- 伺服器和客戶端都支持和使用 HTTP/2。
- 客戶端在 處請求頁面
foo.example.com
。- 在 TLS 協商期間,伺服器提供一個對兩者都有效的證書(
foo.example.com
並且bar.example.com
客戶端接受它)。這可以通過萬用字元證書或 SAN 證書來完成。- 客戶端重用連接來請求
bar.example.com
.- 伺服器無法或不願意支持跨域連接重用(例如,因為您配置了不同的 SSL並且 Apache 想要強制進行 TLS 重新協商),並提供 HTTP 421。
- 客戶端不會自動重試新連接(例如,請參閱Chrome 錯誤 #546991,現已修復)。相關的RfC說客戶端可以重試,而不是它應該或必須。重試失敗並不是特別使用者友好,但對於調試工具或 HTTP 庫來說可能是可取的。
事件 #6 不受您的控制,但根據伺服器的軟體,事件 #5 可能是可修復的。有關發送 HTTP 421 的方式和時間的更多資訊,請參閱伺服器的 HTTP/2 文件。或者,您可以為每個域頒發單獨的證書,但這會產生更多的管理成本並且可能不值得。您也可以完全關閉 HTTP/2,但在大多數情況下這可能是矯枉過正。