PHP cookie 不是由 websocket 握手设置的
PHP Cookies are not set by websocket handshake
我创建了一个 PHP websocket 服务器并通过网络浏览器连接到它。一切正常。现在我想向 websocket 服务器发送一些 cookie 信息,但是 cookie 并没有与 headers 一起发送。我真的不知道为什么 cookie 没有包含在请求 header 中。 (当在 index.php 中使用 php 回显时,cookie 已设置且不为空)
这是请求和响应header
请求
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
回应
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');
我创建了一个 PHP websocket 服务器并通过网络浏览器连接到它。一切正常。现在我想向 websocket 服务器发送一些 cookie 信息,但是 cookie 并没有与 headers 一起发送。我真的不知道为什么 cookie 没有包含在请求 header 中。 (当在 index.php 中使用 php 回显时,cookie 已设置且不为空)
这是请求和响应header
请求
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
回应
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');