fitten code “handshake failed” 是因代理截断 websocket 握手,表现为 upgrade/connection/sec-websocket-key 缺失;需用浏览器 network 和 curl 验证,nginx 必配 proxy_http_version 1.1、upgrade 与 connection 头,并绕过企业代理或改用 wss。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

遇到 Fitten Code 报错 “Handshake failed”,实际是 WebSocket 握手阶段被网络代理截断或改写,导致服务端收不到 Upgrade 头、Sec-WebSocket-Key 为空或 Connection 字段被丢弃——此时浏览器控制台通常显示 Error during WebSocket handshake: Unexpected response code: 400 或直接无响应,而 Nginx/网关日志却查不到异常请求。
确认是否真被代理拦截
打开浏览器开发者工具 → Network 标签页 → 刷新页面 → 筛选 ws:// 或 wss:// 请求 → 查看该请求的 Initiator 列。若显示为 Other 或空白,说明请求根本没发出;若显示为某 JS 文件但状态码是 400/502/0,再点开该请求 → Headers → 检查 Request Headers 是否完整包含:Upgrade: websocket、Connection: Upgrade、Sec-WebSocket-Key。缺任意一项,基本可断定代理层已过滤。
用 curl -v 手动模拟握手:执行 curl -i -N -H "Upgrade: websocket" -H "Connection: Upgrade" -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" -H "Sec-WebSocket-Version: 13" http://your-domain.com/ws。如果返回 HTTP/1.1 101 Switching Protocols,说明服务端本身正常,问题一定出在客户端到服务端之间的中间链路。
Nginx 反向代理必须补全的三行配置
进入 Nginx 配置文件(如 /etc/nginx/conf.d/app.conf),定位到对应 WebSocket 路径的 location 块(例如 location /ws { ... }),在 proxy_pass 后面紧接插入以下三行:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
注意:【Connection 必须用英文双引号包裹 upgrade,且不能写成 'Upgrade' 或小写 upgrade】。漏掉 proxy_http_version 1.1 会导致 HTTP/1.0 下 Upgrade 头被忽略;把 $http_upgrade 写成 $upstream_http_upgrade 或直接写死 websocket 会使其失效;这两处错误在 reload Nginx 后仍能跑通静态资源,但 WebSocket 握手必挂。
改完后执行 sudo nginx -t && sudo systemctl reload nginx,立刻生效。
企业级代理或上网行为管理设备绕过方案
方法一:临时切换网络环境测试
连接手机热点或家用宽带,关闭所有公司级防火墙、深信服、网康等上网行为管理设备。若此时 Fitten Code 连接成功,即可 100% 锁定是企业代理不支持 WebSocket 协议升级。
方法二:强制走直连(仅限开发/测试)
在 Chrome 地址栏输入 chrome://flags/#proxy-server-bypass-list → 将值设为 *.your-domain.com,localhost,127.0.0.1 → 重启浏览器。这会让匹配域名的请求跳过系统代理,直连后端。
方法三:改用 HTTPS + WSS 并透传 Origin(生产必需)
某些老旧代理会放行 HTTPS 流量但深度检测 HTTP 明文头。确保前端连接地址为 wss://your-domain.com/ws,并在 Nginx 中补加:proxy_set_header Origin $http_origin;。服务端收到 Origin 后才可能返回合法的 Access-Control-Allow-Origin,否则部分强策略代理会静默丢弃请求。
Fiddler 抓不到 CONNECT 请求?先做这三件事
第一步:确认浏览器代理指向 Fiddler → Chrome 地址栏输入 chrome://settings/system → “打开计算机的代理设置” → 手动配置为 127.0.0.1:8888,禁用“自动检测设置”。
第二步:禁用 QUIC 协议 → 地址栏输入 chrome://flags/#enable-quic → 设为 Disabled → 完全关闭所有 Chrome 窗口再重开。
第三步:Fiddler 必须开启 HTTPS CONNECT 捕获 → Fiddler → Tools → Options → HTTPS → 勾选 Capture HTTPS CONNECTs(即使你连的是 ws://,这个选项也决定隧道能否建立)。
做完这三项后刷新页面,若 Fiddler 的 WebSessions 列表中仍无类型为 CONNECT、Protocol 显示 websocket 的条目,说明请求压根没走到 Fiddler,而是被系统代理策略或杀毒软件(如 360、火绒)拦截了本地 8888 端口。此时需临时禁用杀软,或在 Fiddler → Tools → Options → Connections → 修改监听端口为 8899,并同步更新浏览器代理配置。











