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 に見られる古いドラフト 75/76 ハンドシェイクと古いバージョンの chrome は、nginx を介してプロキシできません。詳細はこちら: Nginx: リバース プロキシ WebSocket ドラフト 76

于 2013-08-05T03:10:55.560 に答える
1

Nginxは、 draft76 ベースの websockets をサポートしています。クライアントとサーバーの間で使用されている websocket プロトコルのバージョンは実際にはわかりません。彼にとって重要なのは、接続を「アップグレード」する必要があるかどうかだけです。

ここでの問題は、socket.io を使用したドラフト 76 Websockets では、クライアントとサーバーの間で一致するプロトコルと場所が必要であるということです。これが、ここで発生するエラーです。これは、プロキシ構成に正しい HOST ヘッダーが設定されておらず、socket.ioが "domain.com" の代わりに" localhost:81 " をホストとして使用するためです。

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 に答える