站点头部加了 http2,Chrome 正常,IE11 和 iOS 9 的 Safari 打开一片白,控制台没有任何脚本报错。乍看像缓存或者权限的锅,追下去往往不是。
curl -I --http2 https://example.com curl -I --http1.1 https://example.com openssl s_client -connect example.com:443 -alpn h2
追下去是这么回事:HTTP/2 在浏览器端要求 TLS 1.2 以上并且禁用一批老套件,旧客户端协商不到合适参数,连接直接失败。ALPN 协商不上时不会自动退回 1.1。
「HTTP/2 协议要求」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
具体做法是,确认 ssl_protocols 至少包含 TLSv1.2,低版本客户端才有机会协商;不要为了兼容直接把 http2 从 listen 里去掉,先看日志里旧客户端的占比再决定;用 curl 分别按 HTTP/2 和 1.1 请求一次,对比返回的协议版本。
验收就看一点,curl 返回 HTTP/2 200,旧客户端至少能看到降级后的页面。
