【发布时间】:2014-11-15 20:44:36
【问题描述】:
我在运行 Socket.io (v1.0.0) 的子域上有一项服务。作为初始握手和授权的一部分,偶尔会发送一次 OPTIONS 请求(当有一条待处理的消息需要通过 XHR 发送时)。建立 Socket ID 并通过授权的前 2 个请求具有以下标头:
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
...
其中 io 和 cluster_id 设置为 sub.domain.com 并且 SESSID 设置为 .domain.com。发送 OPTIONS 请求时,headers 如下:
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 错误 - 未经授权的套接字 id。
服务器对 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
有没有办法解决这个问题(除了必须向 socket.io 请求添加一个带有 cluster_id 值的自定义参数,以便负载均衡器可以拾取它(这不是一个好主意 - 负载均衡器倾向于将参数转换为一个数字并使用它从可用列表中选择服务器,因此当我向集群添加一个服务器时,大多数客户端将在下一次请求时被发送到错误的服务器。因此 cookie 是唯一的方法来找我。
所有浏览器似乎都对上述所有 OPTIONS 请求执行此操作。这是对 HTTP 规范的常见解释吗?
【问题讨论】:
标签: node.js sockets cookies cross-domain