2016-01-10 16 views
6

Hei, tôi đang cố gắng sử dụng socket.io với các tên miền chéo. Ví dụ: giả sử tên miền là: https://client.domain.comhttps://server.domain.com. mã phía khách hàng của tôi trông như thế này:socket.io liên tục cố gắng sử dụng bỏ phiếu sai địa chỉ

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

Và phía máy chủ:

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

Mọi thứ hoạt động, các thông điệp được gửi qua lại. Nhưng một số socket.io reasone tiếp tục cố gắng sử dụng bỏ phiếu và trên miền sai. Hầu hết các giây tôi thấy các yêu cầu sau:

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

Tại sao socket.io làm điều đó và làm cách nào tôi có thể tắt tính năng này?

EDIT: điều thú vị hơn là nếu tôi nhận xét tất cả các mã để làm với socket.io và chỉ để lại trong <script src="https://server.domain.com/socket.io/socket.io.js"></script> nó vẫn tiếp tục thực hiện các yêu cầu HTTP được mô tả trước đó.

EDIT2: Không chắc chắn nếu điều này sẽ tạo ra bất kỳ sự khác biệt nào nhưng trên thực tế, các tên miền không phải là tên miền phụ của một miền. Chúng là https://clientdomain.comhttps://serverdomain.com.

+1

html của bạn đang được phân phối từ 'client.domain.com', phải không? – cviejo

+0

Không thể sao chép điều này. Tôi cũng không thấy bất kỳ yêu cầu nào cả trước khi tôi lần đầu tiên gọi 'io.connect' .... – cviejo

+0

cố gắng chạy máy chủ với thông tin gỡ lỗi '' DEBUG = socket.io * node myapp'' –

Trả lời

0

Nếu bạn đang sử dụng nginx, tôi nghĩ rằng sự cố của bạn đến từ cách bạn định cấu hình. Bạn hoàn toàn cần những điều sau đây trong location khối của bạn như đã nêu trong socket.io docs

Hãy chắc chắn rằng bạn đã các tiêu đề được đặt đúng:

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 xử lý khá tốt CORS, vì vậy tôi nghi ngờ về vấn đề phụ thuộc ở đây .

0

Yêu cầu mà bạn đang thấy là vì bạn đang phục vụ khách hàng từ https://client.domain.com.

Các

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

chỉ là khách hàng nhận được các tập tin cho socket.io để nó có thể sử dụng đối tượng io. Điều này không liên quan đến kết nối đến https://server.domain.com vì đó là yêu cầu của các tệp socket.io đang được phục vụ từ https://client.domain.com.

Mã của bạn đang kết nối khách hàng với https://server.domain.com bằng cách sử dụng tệp nguồn socket.io mà nó đã nhận được từ https://client.domain.com thông qua https // server.domain.com. Một khi các tập tin được nhận từ máy chủ, chúng được phục vụ cho khách hàng thông qua kết nối của nó đến https://client.domain.com.

Về cơ bản, yêu cầu chỉ là cách của mã để nói rằng nó yêu cầu tệp socket.io từ tên miền của khách hàng, có nguồn gốc từ miền máy chủ nhưng được gửi thông qua miền ứng dụng khách tới thực tế (không phải tên miền của khách hàng).

+0

Điều này không hoàn toàn trả lời câu hỏi."Hầu như mọi giây tôi thấy những yêu cầu này:" tại sao cứ sau mỗi giây? – Mtz

Các vấn đề liên quan