【问题标题】:Is it possible to seamlessly redirect websockets?是否可以无缝重定向 websockets?
【发布时间】:2018-04-08 08:11:41
【问题描述】:

我知道可以通过反向代理(如 Nginx、HAproxy 等)传递请求,但我需要将请求重定向到同一域后缀中的另一台公共服务器。 IE。从wss://example.comwss://ws1.example.com
这是一个例子:

我需要重定向来自 Nginx 或 Java 的请求。 有可能组织吗?我需要在客户端处理重定向还是此代码就足够了?

var socket = new WebSocket("wss://example.com");

socket.onopen = function() {
  alert("Connection established.");
};

socket.onclose = function(event) {
  alert('Connection closed');
};

socket.onmessage = function(event) {
  alert("Data: " + event.data);
};

socket.onerror = function(error) {
  alert("Error " + error.message);
};

【问题讨论】:

  • 我认为这取决于客户端的实现。大多数 ws 客户端在 HTTP 握手期间不遵循重定向..
  • 你知道跟随重定向的浏览器客户端吗?
  • 我不这么认为。客户端可以从响应中获取新的位置 url,断开连接并重新连接到新的 url。我怀疑当前的实现会引发错误。也许像socket.io这样的客户端ws库?有open issue 与以下重定向相关,但没有任何进展..
  • 是的,但我不想强迫客户管理这个逻辑。当然这是一种变通方法,但希望将来能正常支持重定向。
  • @JohnBachir 我没有,但 jfriend00 对客户端重定向逻辑提出了一个很好的观点。如果您同时管理服务器端和客户端代码,那么它比向客户端提供通用 API 更容易实现。如果您提供的是通用 API,那么合并一些决定您的 API 使用的策略可能是有意义的。也就是说,我没有机会研究这个,所以,可能存在更好的替代方案。

标签: javascript nginx websocket


【解决方案1】:

根据webSocket specification

一旦发送了客户端的打开握手,客户端必须等待服务器的响应,然后再发送任何进一步的数据。客户端必须按如下方式验证服务器的响应:

  1. 如果从服务器收到的状态码不是 101,则 客户端根据 HTTP [RFC2616] 程序处理响应。在 特别是,客户端可能会执行身份验证,如果它 收到 401 状态码;服务器可能会重定向客户端 使用 3xx 状态码(但客户不需要遵循 他们)等。

因此,是否支持重定向完全取决于客户,并且显然不是您可以依赖的东西,除非您在广泛的测试中发现所有相关客户都支持它(他们显然不支持)。

您将不得不使用诸如服务器端代理或客户端方案之类的东西来手动将连接移动到另一台服务器。

【讨论】:

    猜你喜欢
    • 2012-02-02
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2012-11-02
    相关资源
    最近更新 更多