Safari 5.0通过nginx https代理连接时,Websocket位置不匹配

时间:2013-08-05 02:25:58

标签: nginx socket.io

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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;
}

注意:

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