选项请求中缺少Cookie

问题描述:

我在运行Socket.io(v1.0.0)的子域上有服务。作为初始握手和授权的一部分,OPTIONS请求在一段时间内发送(当有一个待处理消息需要通过XHR发送时)。第一2个请求建立套接字ID并传递该授权具有以下标题:选项请求中缺少Cookie

GET /socket.io/?time=1411338676420&EIO=3&transport=polling&t=1411338676423-0 HTTP/1.1 
... 
Cookie: cluster_id=1382; SESSID=h13rh19hu9hf913hf912fh91 
... 

GET /socket.io/?time=1411338676420&EIO=3&transport=polling&t=1411338676576-1&sid=rV4pN-dcYPMTVgQUAAAH HTTP/1.1 
... 
Cookie: io=rV4pN-dcYPMTVgQUAAAH; cluster_id=1382; SESSID=h13rh19hu9hf913hf912fh91 
... 

IOCLUSTER_ID被设置为sub.domain.comSESSID被设定为.domain.com。当发送OPTIONS请求,所述报头有以下几种:

OPTIONS /socket.io/?time=1411338676420&EIO=3&transport=polling&t=1411338676731-2&sid=rV4pN-dcYPMTVgQUAAAH HTTP/1.1 
... 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: content-type 
... 

否Cookie头部通过,所以负载平衡器无法将请求重定向到正确的“簇”,因此请求被发送到一个随机服务器,这会导致400错误 - 未经授权的套接字标识。

服务器的答复是这样的OPTIONS请求:

HTTP/1.1 400 Bad Request 
Access-Control-Allow-Credentials: true 
Access-Control-Allow-Origin: https://domain.com 
Set-Cookie: cluster_id=1024; path=/; HttpOnly 

有没有解决这个(的方式除了具有自定义参数添加到与CLUSTER_ID值socket.io要求,从而使负载平衡器可以选择它(这不是一个好主意 - 负载平衡器倾向于将参数转换为数字并使用它从可用列表中选择服务器,因此当我向群集添加一台服务器时,大多数客户端将被发送到错误的服务器在他们的下一个请求。因此,Cookie是唯一的方式去为我。

所有兄弟Wsers似乎对所有的OPTIONS请求都这样做,就像上面的那样。这是HTTP规范的常见解释吗?

也有同样的问题。

我通过在平衡器中添加一个OPTIONS方法处理程序来解决这个问题。

if(req.method == 'OPTIONS'){ 
    res.setHeader('Access-Control-Allow-Credentials', true); 
    res.setHeader('Access-Control-Allow-Origin', req.headers.origin); 
    res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); 
    res.end(); 
    return; 
} 

由平衡器处理的OPTIONS方法请求ID,它用CORS选项作出响应。 干杯