我目前在不同的子域下混合运行不同的服务:
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/
概括:
条件
预期行为:
看到的行为
对第二台主机 (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 的行为非常出乎意料——或者根本就是错误的。