内网 Squid 后面的客户端连不上,握手返回 400 Bad Request,报文里 Upgrade: websocket 那行被删掉了,同一台服务端直连正常。乍看像缓存或者权限的锅,追下去往往不是。
curl -v --http1.1 -H "Connection: Upgrade" \ -H "Upgrade: websocket" \ https://example.com/ws
追下去是这么回事:HTTP/1.0 没有 Upgrade 语义,代理按 1.0 转发时会把逐跳头全部丢掉,后端收到的是没有升级意图的 GET。部分代理还会顺手把长连接关掉。
「代理不支持升级」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
具体做法是,确认代理版本和支持的协议 老版本考虑升级或旁路;给 WebSocket 配独立域名 不走这个代理;必须走代理就让客户端用 443 直连 中间别插设备;用 curl 加 --http1.1 复现一次对比报文。
验收就看一点,换到独立域名后握手返回 101 代理日志里不再出现 400。
