0

在旧版本的 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 一起使用?

4

2 回答 2

1

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

于 2013-08-05T03:10:55.560 回答
1

Nginx确实支持基于 draft76 的 websockets。它确实不知道您的客户端和服务器之间使用的 websocket 协议版本是什么。对他来说重要的是它是否必须“升级”连接

这里的问题是,带有 socket.io 的 76 个 websockets 草案需要在客户端和服务器之间有一个匹配的协议和位置,这就是你在这里得到的错误。这是因为您的代理配置中没有设置正确的 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;
}

笔记:

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

于 2014-04-29T15:56:55.833 回答