在较旧版本的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一起使用?
答案 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服务器。