From ab4c31311c8e738c7edef893599cfd82176f13f1 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 15 Oct 2026 16:27:34 +0800 Subject: [PATCH] =?UTF-8?q?fix(relay):=20=E4=B8=8A=E6=B8=B8=E6=8F=A1?= =?UTF-8?q?=E6=89=8B=E4=B8=8D=E5=86=8D=E5=8F=91=E9=80=81=20Referer?= =?UTF-8?q?=EF=BC=88=E5=AF=B9=E9=BD=90=E6=B5=8F=E8=A7=88=E5=99=A8=E7=9C=9F?= =?UTF-8?q?=E5=AE=9E=E6=8F=A1=E6=89=8B=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 依据:官方 Copy-as-cURL 的握手头里没有 Referer —— 浏览器发起的 WebSocket 握手本身不带它 - 实测:用原版头直连 wss://c1.3dtank.com:9090/ 可保持连接(8s 超时退出);而中继因多带 Referer 被上游 code=1000 关闭(短命连接) - 仅删 Referer;Origin 仍强制覆盖为 https://3dtank.com(本机 origin 会被上游拒) --- 3DTank/tools/wss_server.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/3DTank/tools/wss_server.js b/3DTank/tools/wss_server.js index c6c3234..0c533d6 100644 --- a/3DTank/tools/wss_server.js +++ b/3DTank/tools/wss_server.js @@ -537,10 +537,12 @@ WsServer.on('connection', (Client, Req) => { UpHeaders[L] = Req.headers[K]; } if (!UpHeaders['user-agent']) UpHeaders['user-agent'] = UPSTREAM_HEADERS['user-agent']; - // Origin/Referer **强制用真实站点的值**:前端(浏览器)带的是本机地址 http://localhost:8080, + // Origin **强制用真实站点的值**:前端(浏览器)带的是本机地址 http://localhost:8080, // 真实服务器会据此校验来源,必须覆盖,不能透传。 UpHeaders['origin'] = UPSTREAM_HEADERS.origin; - UpHeaders['referer'] = UPSTREAM_HEADERS.referer; + // Referer:**不要加**。浏览器发起的 WebSocket 握手本身不带 Referer(见官方 Copy-as-cURL 的握手头), + // 带上它会让上游把连接识别为「非浏览器来源」——实测疑似导致「复用哈希的二次连接」被 code=1000 关闭。 + delete UpHeaders['referer']; // 诊断:打印**发往上游**的真实握手来源(注意与上面「来源: … Origin: …」那行区分开 —— // DevTools 里看到的本机 Origin 是「浏览器→中继」这一段,页面 JS 改不了;中继改的是「中继→上游」这一段) State.Log(