From 4eeb939c347d920c7da66e1168a1100f3fb63db1 Mon Sep 17 00:00:00 2001 From: Artea Date: Sun, 28 Jun 2026 00:03:51 +0800 Subject: [PATCH] fix(kimi-web): set rewriteWsOrigin for dev and preview proxy Set Vite's rewriteWsOrigin option so the WebSocket Origin header is rewritten to match the upstream server target during local development. This fixes 403 handshake failures when the browser opens the dev UI on localhost:5175 while the server binds 127.0.0.1:58627. --- .changeset/fix-ws-origin-dev-proxy.md | 5 +++++ apps/kimi-web/vite.config.ts | 16 ++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 .changeset/fix-ws-origin-dev-proxy.md diff --git a/.changeset/fix-ws-origin-dev-proxy.md b/.changeset/fix-ws-origin-dev-proxy.md new file mode 100644 index 000000000..c54f21d64 --- /dev/null +++ b/.changeset/fix-ws-origin-dev-proxy.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": patch +--- + +Fix WebSocket connection failures in the bundled web UI's local dev mode when the browser opens on `localhost` while the server binds `127.0.0.1`. diff --git a/apps/kimi-web/vite.config.ts b/apps/kimi-web/vite.config.ts index 0bc8a10a0..2c9a6a593 100644 --- a/apps/kimi-web/vite.config.ts +++ b/apps/kimi-web/vite.config.ts @@ -11,6 +11,18 @@ const pkg = JSON.parse(readFileSync(new URL('./package.json', import.meta.url), version: string; }; +function apiProxyConfig() { + return { + target: serverTarget, + changeOrigin: true, + ws: true, + // Rewrite the WebSocket Origin header to the upstream target so the + // server's same-origin check passes even when the browser opens the dev UI + // on `localhost:5175` while the server binds `127.0.0.1`. + rewriteWsOrigin: true, + }; +} + export default defineConfig({ plugins: [vue(), tailwindcss()], // Expose the dev proxy's upstream server target to the client so the UI can @@ -26,7 +38,7 @@ export default defineConfig({ // Same-origin dev: the browser calls Vite, Vite forwards to the server. // No CORS anywhere. The real server serves REST + WS all under /api/v1. proxy: { - '/api/v1': { target: serverTarget, changeOrigin: true, ws: true }, + '/api/v1': apiProxyConfig(), }, }, // `vite preview` (the production build served locally) needs the same proxy — @@ -35,7 +47,7 @@ export default defineConfig({ preview: { port: Number(process.env.WEB_PREVIEW_PORT) || 4175, proxy: { - '/api/v1': { target: serverTarget, changeOrigin: true, ws: true }, + '/api/v1': apiProxyConfig(), }, }, build: {