2016-01-10 10 views
6

Hei, próbuję użyć socket.io z domenami krzyżowymi. Na przykład powiedzmy, domeny to: https://client.domain.com i https://server.domain.com. Mój kod po stronie klienta wygląda następująco: po stroniesocket.io ciągle próbuje użyć pollingu na niewłaściwym adresie

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

i serwer:

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

Wszystko działa, wiadomości wysyłane tam iz powrotem. Ale niektóre reasone socket.io nadal próbuje użyć sondowania i na niewłaściwej domenie. Prawie co drugi widzę te żądania:

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

Dlaczego to robi socket.io i jak mogę to wyłączyć?

EDYCJA: ciekawsze jest to, że jeśli skomentuję cały kod związany z gniazdem socket.io i pozostawię tylko w <script src="https://server.domain.com/socket.io/socket.io.js"></script>, nadal będzie wysyłane te żądania HTTP opisane wcześniej.

EDIT2: Nie jestem pewien, czy to spowoduje jakąkolwiek różnicę, ale w rzeczywistości domeny nie są subdomenami jednej domeny. Są to: https://clientdomain.com i https://serverdomain.com.

+1

Twój html jest wyświetlany z 'client.domain.com', prawda? – cviejo

+0

Nie można tego zreplikować. Nie widzę też żadnych próśb, zanim najpierw zadzwonię do 'io.connect' .... – cviejo

+0

spróbuj uruchomić serwer z informacjami debugowania' 'DEBUG = socket.io * node myapp'' –

Odpowiedz

0

Jeśli używasz nginx, myślę, że Twój problem wynika ze sposobu, w jaki go skonfigurowałeś. Absolutnie konieczne są następujące rzeczy w swoim bloku location jak stwierdzono w socket.io docs

Upewnij się, że został ustawiony prawidłowo te nagłówki:

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 obsłużyć całkiem dobrze CORS, więc wątpię, problem polega tutaj .

0

Żądana prośba dotyczy tego, że obsługujesz klienta od https://client.domain.com.

The

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

jest tylko klient się pliki dla socket.io tak, że można go używać IO obiekt. Nie jest to związane z połączeniem z https://server.domain.com, ponieważ jest to żądanie plików socket.io, które są wyświetlane od https://client.domain.com.

Twój kod łączy klienta z https://server.domain.com przy użyciu plików źródłowych socket.io, które odebrał od https://client.domain.com przez https // serwer.domena.com. Po odebraniu plików z serwera są one dostarczane klientowi poprzez jego połączenie z https://client.domain.com.

Zasadniczo żądanie jest po prostu sposobem kodu mówiącym, że żąda plików socket.io z domeny klienta, które pochodzą z domeny serwera, ale są przesyłane przez domenę klienta do rzeczywistego klienta (nie domeny klienta).

+0

To nie odpowiada na pytanie."Prawie w każdej sekundzie widzę tę prośbę:" dlaczego prawie co sekundę? – Mtz

Powiązane problemy