Software engineer


Envoy Gateway 中偶发的 CORS 预检 404:HTTP/2 连接复用与 Listener 主机名

在 Envoy Gateway 中,浏览器的 CORS 预检请求有时成功、有时返回 404,访问日志还可能出现下面这种看似矛盾的情况:

method: OPTIONS
protocol: HTTP/2
authority: api.example.com
requested_server_name: api-alt.example.com

这两个主机名不一致并不一定表示请求被篡改。它通常与 TLS、HTTP/2 的分层设计以及浏览器的连接复用有关。

authorityrequested_server_name 来自不同协议层

requested_server_name 是客户端在 TLS 握手阶段发送的 SNI。它用于选择证书和 HTTPS Listener,一条 TLS 连接在建立时确定一次。

authority 是 HTTP/2 请求中的 :authority 伪首部,作用类似 HTTP/1.1 的 Host。同一条 HTTP/2 连接上的每个请求都可以携带自己的 :authority

因此,一条连接可能表现为:

TLS 连接:SNI = api-alt.example.com
  ├─ HTTP/2 请求:authority = api-alt.example.com
  └─ HTTP/2 请求:authority = api.example.com

为什么浏览器会复用这条连接

HTTP/2 允许客户端在满足安全条件时,将一条 TLS 连接用于多个 origin。这种行为通常称为 HTTP/2 connection coalescing

常见条件包括:

Read more...
1 of 1