socket.io不断尝试使用错误的地址轮询

嘿,我想用跨域的socket.io。 例如,假设域名是: https : //client.domain.com和https://server.domain.com 。 我的客户端代码如下所示:

socket = io.connect("https://server.domain.com"); socket.on("connect", function () { console.log("socketio Connected to server!"); }); socket.emit("test", {"test":"test"}); 

和服务器端:

 var fs = require('fs'); var https = require('https'); var express = require('express'); var socketIO = require('socket.io'); var app = express(); // Settings var serverOptions = { key: fs.readFileSync('privkey1.pem'), cert: fs.readFileSync('cert1.pem') }; var serverPort = 443; // Logic var server = https.createServer(serverOptions, app); var io = socketIO(server); io.on('connection', function(socket) { socket.on("test", function(data) { console.log(data); }); }); server.listen(serverPort, function() { console.log('server up and running at %s port', serverPort); }); 

一切正常,消息来回发送。 但是一些reasone socket.io一直试图使用轮询和错误的域名。 几乎每一秒我都看到这些要求:

 Request URL:https://client.domain.com/socket.io/?EIO=3&transport=polling&t=1452418594321-145 Request Method:GET Status Code:302 OK 

为什么socket.io这样做,我怎么能把这个closures?

编辑:什么更有趣的是,如果我注释掉所有的代码做socket.io,只留在<script src="https://server.domain.com/socket.io/socket.io.js"></script>它仍然保持前面描述的这些HTTP请求。

编辑2:不知道这是否会有所作为,但实际上这些域不是一个域的子域。 他们是https://clientdomain.comhttps://serverdomain.com

如果你使用nginx ,我认为你的问题来自你configuration它的方式。 您在socket.io文档中说明的location块中绝对需要以下内容

确保你正确设置了这些标题:

 location / { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; ... } 

Socket.IO处理相当不错的CORS,所以我怀疑这个问题依赖于这里。

您看到的请求是因为您正在从https://client.domain.com服务客户端&#x3002;

 Request URL:https://client.domain.com/socket.io/?EIO=3&transport=polling&t=1452418594321-145 

只是客户端获取socket.io的文件,以便它可以使用io对象。 这与https://server.domain.com的连接无关,因为它是从https://client.domain.com提供的socket.io文件的请求&#x3002;

您的代码使用从https://client.domain.com通过https // server.domain.com收到的socket.io源文件将客户端连接到https://server.domain.com 。 一旦从服务器接收到文件,就会通过连接到https://client.domain.com将其提供给客户端&#x3002;

从本质上讲,请求只是代码的方式,它是从客户端域请求socket.io文件,它源自服务器域,但通过客户端域发送到实际客户端(而不是客户端域)。