2016-01-10 44 views
6

嘿,我正在嘗試使用socket.io與跨域。例如,假設域名是:https://client.domain.comhttps://server.domain.com。我的客戶端代碼如下所示:socket.io不斷嘗試使用錯誤的地址輪詢

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這樣做,我該如何關閉它?

編輯:什麼更有趣的是,如果我註釋掉所有的代碼與socket.io做,只留在<script src="https://server.domain.com/socket.io/socket.io.js"></script>它仍然不斷做出前面描述的這些HTTP請求。

EDIT2:不知道這是否會有所作爲,但實際上這些域不是一個域的子域。它們是https://clientdomain.comhttps://serverdomain.com

+1

你的html是從'client.domain.com'提供的,對吧? – cviejo

+0

無法複製此內容。在我第一次調用'io.connect'前,我也沒有看到任何請求.... – cviejo

+0

嘗試運行具有調試信息的服務器''DEBUG = socket.io * node myapp'' –

回答

0

如果您使用nginx,我認爲您的問題來自您配置它的方式。你絕對需要在location塊以下的事情作爲socket.io docs

陳述確保你有正確設置這些標題:

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,所以我懷疑這裏的問題依賴。

0

您所看到的請求是因爲您正在爲https://client.domain.com的客戶提供服務。

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文件的請求。

您的代碼使用通過https // server.domain.com從https://client.domain.com收到的socket.io源文件將客戶端連接到https://server.domain.com。一旦從服務器接收到文件,它們將通過連接到https://client.domain.com而被送達客戶端。

從本質上講,請求只是代碼的方式,說它是從客戶端域請求socket.io文件,它源自服務器域,但通過客戶端域發送到實際客戶端(而不是客戶端域)。

+0

這並不完全回答這個問題。「幾乎每一秒我都會看到這些要求:」爲什麼幾乎每一秒? – Mtz