PHP cookie不是通过websocket握手来设置的


PHP Cookies are not set by websocket handshake

我创建了一个PHP websocket服务器,并与一个web浏览器连接到它。一切正常。现在我想发送一些cookie信息到websocket服务器,但是这些cookie从来没有发送过报头。我真的不知道为什么cookie不包含在请求头中。(当在index.php中回显php时,cookie是设置的,而不是空的)

这是请求和响应头

GET ws://127.0.0.1:9000/chat HTTP/1.1
Host: 127.0.0.1:9000
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://localhost
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
Sec-WebSocket-Key: 2nR9SZYdLOG32fpV6eJ/wA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
<<p> 反应/strong>
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: QecMAdsem/PYww1pYkyjD+79OmM=

握手

// do handyshake: (hybi-10)
$secKey = $headers['Sec-WebSocket-Key'];
$secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
$response = "HTTP/1.1 101 Switching Protocols'r'n";
$response.= "Upgrade: websocket'r'n";
$response.= "Connection: Upgrade'r'n";
$response.= "Sec-WebSocket-Accept: " . $secAccept . "'r'n";

客户端连接服务器的方式(javascript)

var socket = new WebSocket('ws://127.0.0.1:9000/chat');

您正在从localhost加载页面,但将WebSocket连接到127.0.0.1
这两个被认为是两个不同的域,所以它们不共享cookie。

你需要将你的WebSocket连接为:

var socket = new WebSocket('ws://localhost:9000/chat');

或者更好,如果你不硬编码主机名:

var socket = new WebSocket('ws://'+location.hostname+':9000/chat');