F我參考__ox和d_ng_我x_F一世r和F這X一種ndnG一世nXFirefox and nginx: Firefox 似乎記憶體並傳遞了錯誤子域的內容
我目前在不同的子域下混合執行不同的服務:
a.example.com:nginx 代理後面的 Docker 容器
b.example.com:nginx 站點
c.example.com:nginx 代理後面的 Docker 容器
a 和 c 共享同一個 ipv4,b 有自己的 ipv4,而 a、b 和 c 都使用不同的 ipv6 地址。它們都是 SSL 安全的,非 ssl 流量由 nginx(通過 301)重定向到 ssl 安全站點。
所有這些都通過 HSTS 保護(未設置可選的“includeSubdomains”)。
現在,我的問題
- 通過 Firefox打開https://a.example.com -> 工作
- 通過 Firefox打開https://b.example.com -> 工作
- 通過 Firefox打開https://a.example.com -> 不起作用,而是顯示 b.example.com。似乎firefox以某種方式記憶體了b.example.com。如果我按 shift+reload,firefox 會載入正確的 a.example.com 站點。
這是 Firefox 特有的問題。以上內容與 Chrome、Vivaldi、MS Edge(基於 Chromium)完美配合。它甚至可以與 wget 一起正常工作。我不知道是什麼原因導致 Firefox 從其儲存中獲取錯誤的站點。
任何幫助都將不勝感激。
如果有人遇到同樣的問題:這是一個 firefox 錯誤,這裡有更多詳細資訊:https ://matthias.wuerfl.com/firefox-http2-ipv6-pitfall/
概括:
條件
- 兩個(或更多)子域(同一個域)
- …共享一個通用的萬用字元 ssl 證書
- 在同一主機上(相同的 IPv4 地址)
- 但使用不同的 IPv6 地址
- 客戶端:Firefox(只有 Firefox 有此行為)
- 使用 HTTP/2
- 使用 IPv6
預期行為:
- 位置欄中的 foo.example.com 顯示 foo.example.com
- 位置欄中的 bar.example.com 顯示 bar.example.com
看到的行為
對第二台主機 (bar) 的請求轉到第一台主機 (foo)。
解釋
使用 HTTP/2 Firefox 共享與網路伺服器的連接(“池”),通過省略握手和 tcp 慢啟動來加速頁面載入。Firefox 不是通過查看主機名,而是通過查看 IPv4 地址和證書來確定哪些連接可以合併在一起。如果第二台主機 (bar) 的 IPv4 地址與第一台主機 (foo) 的 IPv4 地址匹配,並且用於 foo 的證書也與 bar 匹配,則到 foo 的連接將被重新用於 bar。
問題
當有人連接到 foo 的 IPv6 地址時,網路伺服器可能未配置為顯示 bar 的內容。對使用 IPv6 不再需要 SNI 和基於名稱的虛擬主機這一事實感到高興的網路伺服器管理員(如我)可能已經配置了他們的網路伺服器,錯誤的假設是如果為主機名 foo 傳入到該主機的連接發布了 IPv6 地址將轉到該 IP 地址。
Firefox 的行為非常出乎意料——或者根本就是錯誤的。