跳转到内容

WebSocket

此页面由 docs/rules/websocket.md 自动同步生成。

本章介绍 WebSocket 请求的转发和代理规则。


将 WebSocket 请求转换为新的 ws:// 请求(服务端将收到转换后的 WebSocket URL)。

⚠️ 注意:只支持 WebSocket 请求 ws[s]://domain[:port]/[path][?query],不支持转换隧道代理和普通 HTTP/HTTPS

pattern ws://target_host[:port][/path]
Terminal window
# 将 ws 请求转发到另一个服务器
ws://www.example.com/socket ws://ws-server.example.com/socket
# 将 wss 请求降级为 ws
wss://www.example.com/chat ws://internal-ws.example.com/chat
Terminal window
ws://www.example.com/path1 ws://www.test.com/path/xxx
wss://www.example.com/path2 ws://www.abc.com/path3/yyy
原始请求转换结果(服务端收到的 URL)
ws://www.example.com/path1ws://www.test.com/path/xxx
ws://www.example.com/path1/a/b/c?queryws://www.test.com/path/xxx/a/b/c?query
wss://www.example.com/path2ws://www.abc.com/path3/yyy
wss://www.example.com/path2/a/b/c?queryws://www.abc.com/path3/yyy/a/b/c?query
请求类型匹配 ws 规则的结果
WebSocket 请求正常转发
隧道代理请求非拦截(passthrough)隧道忽略匹配;TLS 拦截隧道内的 WebSocket 升级仍会被匹配并改写
普通 HTTP/HTTPSws:// 作为目标时按普通 HTTP 请求转发(不会返回 502);ws:// 作为 pattern 时不匹配普通 HTTP
测试场景规则预期
ws 转发ws://test.com ws://target.com转发到 ws://target.com
wss 降级为 wswss://test.com ws://target.com转发到 ws://target.com
路径自动拼接ws://test.com/api ws://target.com/v2/api/xxx/v2/xxx
HTTP 请求http://test.com ws://target.com作为普通 HTTP 请求转发,返回 200

将 WebSocket 请求转换为新的 wss:// 请求(服务端将收到转换后的 WebSocket Secure URL)。

⚠️ 注意:只支持 WebSocket 请求 ws[s]://domain[:port]/[path][?query],不支持转换隧道代理和普通 HTTP/HTTPS

pattern wss://target_host[:port][/path]
Terminal window
# 将 ws 请求升级为 wss
ws://www.example.com/socket wss://secure-ws.example.com/socket
# 将 wss 请求转发到另一个安全服务器
wss://www.example.com/chat wss://wss-server.example.com/chat

ws 规则相同:

Terminal window
ws://www.example.com/path1 wss://www.test.com/path/xxx
wss://www.example.com/path2 wss://www.abc.com/path3/yyy
原始请求转换结果(服务端收到的 URL)
ws://www.example.com/path1wss://www.test.com/path/xxx
ws://www.example.com/path1/a/b/c?querywss://www.test.com/path/xxx/a/b/c?query
wss://www.example.com/path2wss://www.abc.com/path3/yyy
wss://www.example.com/path2/a/b/c?querywss://www.abc.com/path3/yyy/a/b/c?query
请求类型匹配 wss 规则的结果
WebSocket 请求正常转发
隧道代理请求非拦截(passthrough)隧道忽略匹配;TLS 拦截隧道内的 WebSocket 升级仍会被匹配并改写
普通 HTTP/HTTPSwss:// 作为目标时按普通 HTTP 请求转发(向非 TLS 上游 TLS 握手失败时才返回 502);wss:// 作为 pattern 时不匹配普通 HTTP
测试场景规则预期
ws 升级为 wssws://test.com wss://target.com转发到 wss://target.com
wss 转发wss://test.com wss://target.com转发到 wss://target.com
路径自动拼接wss://test.com/api wss://target.com/v2/api/xxx/v2/xxx
HTTP 请求http://test.com wss://target.com作为普通 HTTP 请求转发(TLS 握手失败时返回 502)

特性wswss
协议WebSocket (非加密)WebSocket Secure (TLS 加密)
默认端口80443
安全性无加密TLS 加密
适用场景内网/开发环境生产环境/公网
证书要求需要有效 TLS 证书

将生产环境的 WebSocket 请求代理到本地开发服务器:

Terminal window
# 生产环境 wss 降级到本地 ws
wss://api.example.com/ws ws://localhost:8080/ws
Terminal window
# 切换 WebSocket 服务器
ws://www.example.com/socket ws://test-server.example.com/socket
wss://www.example.com/socket wss://test-server.example.com/socket
Terminal window
# 将请求路由到不同后端
ws://www.example.com/socket ws://ws-server-1.example.com/socket
# ws://www.example.com/socket ws://ws-server-2.example.com/socket
Terminal window
# 本地开发时降级为 ws(避免证书问题)
wss://api.example.com/realtime ws://localhost:3000/realtime
# 测试 TLS 配置
ws://api.example.com/realtime wss://secure-api.example.com/realtime
Terminal window
# WebSocket 转发 + 请求头修改
wss://api.example.com/ws wss://internal-ws.example.com/ws reqHeaders://(X-Forwarded-For:client-ip)
# WebSocket 转发 + 延迟(注意:reqDelay 等请求时序变换作用于 HTTP 请求/响应阶段,
# 不会作用于 WebSocket 握手/升级,握手会立即完成)
ws://api.example.com/socket ws://test-server.example.com/socket reqDelay://1000

  1. 仅支持 WebSocketwswss 规则的路径拼接等转换仅对 WebSocket 升级请求生效;普通 HTTP/HTTPS 请求若匹配到目标为 ws:// 的规则,会按普通 HTTP 请求转发(目标为 wss:// 时仅在向非 TLS 上游 TLS 握手失败时返回 502),而非刻意拒绝
  2. 协议转换:可以在 wswss 之间相互转换
  3. 路径处理:默认会自动拼接剩余路径
  4. 查询参数:自动保留原始请求的查询参数
  5. 隧道代理:只有非拦截(passthrough)的 CONNECT 隧道会忽略这些规则;隧道一旦被 TLS 拦截,其内部的 WebSocket 升级仍会被匹配并改写

  • host - HTTP/HTTPS 请求转发
  • proxy - HTTP 代理转发