https中的Websocket连接问题

Posted

技术标签:

【中文标题】https中的Websocket连接问题【英文标题】:Websocket connection issue in https 【发布时间】:2017-07-18 15:39:42 【问题描述】:

Websocket 连接在 http 中有效,但在 https 中无效。

收到错误消息“失败:WebSocket 握手期间出错:‘升级’标头丢失”。

请帮忙解决这个问题

【问题讨论】:

【参考方案1】:

检查您是否有一个反向代理,您的套接字通过该反向代理进行通信。

如果你使用的是 nginx,你可以在你的位置标签中使用以下 config-sn-p:(source)

location / 
    proxy_pass http://app;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

如果您使用的是 caddy,可以使用以下 config-sn-p:(source)

proxy / http://app 
    transparent
    header_upstream X-Forwarded-Ssl on

【讨论】:

感谢您的信息。我在 Amazon AWS linux 环境中使用 Apache 网络服务器和 php 我正在使用下面的代码。请帮助解决问题。 //握手新客户端。 $secKey = $headers['Sec-WebSocket-Key']; $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))); //握手标头 $upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" . "升级:websocket\r\n" 。 "连接:升级\r\n" 。 "WebSocket-Origin: $host\r\n" 。 “WebSocket 位置:wss://$host:$port/demo/shout.php\r\n”。 "Sec-WebSocket-Accept:$secAccept\r\n\r\n"; socket_write($client_conn,$upgrade,strlen($upgrade)); 为什么要手动添加标题?我不了解 apache,但通常标题是自动编写的,不是吗?通常您在反向代理上操作标头,这可能会导致像您这样的错误

以上是关于https中的Websocket连接问题的主要内容,如果未能解决你的问题,请参考以下文章

websocket._exceptions.WebSocketProxyException:通过代理连接失败状态:503

移动网络中 8080 或 80 端口上的 WebSocket 连接失败

WebSocket简介

tomcat 7.0支持的最大活动websocket连接数是多少

什么项目将使用 websocket 而不是 webrtc?

在 WebSocket 控制器中获取登录用户的 Principal