2013-08-05 74 views
0

連接在一箇舊版本的Safari WebSocket的位置不匹配,當我連接到我的socket.io,我得到一個錯誤:當Safari瀏覽器5.0通過nginx的HTTPS代理

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一起工作?

回答

1

Nginx的確實支持draft76基於WebSockets的。它確實不知道你的客戶端和服務器之間使用的websocket協議版本是什麼。所有對他來說重要的是它是否必須"Upgrade" the connection or not

這裏的事情是,draft 76 websockets with socket.io要求有一個匹配協議和位置之間的客戶端和服務器,這是你在這裏得到的錯誤。這是因爲您的代理配置中沒有設置正確的HOST頭,因此socket.io使用「localhost:81」而不是「domain.com」作爲主機。

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服務器使用相同的協議中使用的客戶端匹配。