【问题标题】:Websocket location mismatch when Safari 5.0 connects via nginx https proxySafari 5.0 通过 nginx https 代理连接时 Websocket 位置不匹配
【发布时间】:2013-08-05 02:25:58
【问题描述】:

在旧版本的 Safari 上,当我连接到我的 socket.io 时,我收到一个错误:

Error during WebSocket handshake: location mismatch: wss://domain.com/node/socket.io/1/websocket/id != wss://localhost:81/node/socket.io/1/websocket/id

最新版本的 Safari 似乎运行良好。我可以很好地与 Firefox 和 chrome 连接。

服务端代码为:

var io = require('socket.io').listen(81, {resource: '/node/socket.io', secure: true});

客户端代码是:

socket = io.connect('https://domain.com/', {resource: 'node/socket.io', secure: true, 'connect timeout': 1000});

我通过 nginx 路由这个:

location /node {
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_pass http://localhost:81;
}

如何修复此错误并使其与旧版本的 Safari 一起使用?

【问题讨论】:

    标签: nginx socket.io


    【解决方案1】:

    Nginx websocket 代理仅适用于符合 RFC6455 的握手。在 Safari 5 和旧版本的 chrome 中发现的较旧的 75/76 握手草案无法通过 nginx 代理。更多细节在这里:Nginx: Reverse proxying WebSocket Draft 76

    【讨论】:

      【解决方案2】:

      Nginx 是否支持基于draft76的websockets。它确实不知道您的客户端和服务器之间使用的 websocket 协议版本是什么。对他来说重要的是是否必须"Upgrade" the connection or not

      这里的问题是draft 76 websockets with socket.io 需要在客户端和服务器之间有一个匹配的协议和位置,这就是你在这里遇到的错误。这是因为您的代理配置中没有设置正确的 HOST 标头,使得 socket.io 使用“localhost:81”而不是“domain.com”作为主机.

      location /node {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_pass https://localhost:81;
      }
      

      注意:

      protocollocation 都必须匹配,因此您还必须使用客户端使用的相同协议代理到您的 socket.io 服务器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-11
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 1970-01-01
        • 2018-04-23
        • 2020-05-31
        相关资源
        最近更新 更多