如何移除或替换Swoole WebSocket响应中的Server响应头
OpenSwoole WebSocket服务修改/删除Server响应头方案
可以完全删除Server响应头,也可以将其替换为任意自定义名称,不需要修改OpenSwoole源码,有两种常用实现方式:
- 配置项直接覆盖(推荐)
启动服务时通过set方法传入server配置项即可直接覆盖默认的Server: OpenSwoole x.x.x响应头,配置为空字符串时会直接移除该响应头,示例代码:
该方式不需要改动原有握手逻辑,不会引入额外兼容性问题。$ws = new Swoole\WebSocket\Server('0.0.0.0', 9501); $ws->set([ 'server' => 'XYZ' // 此处填写自定义的服务名,传入''则不返回Server响应头 ]); // 后续注册消息接收、连接关闭等业务事件回调即可 - 握手回调手动调整
如果需要对握手阶段的响应头做更细粒度的控制,可以注册handshake事件回调,在回调中手动修改/移除Server头,示例代码:$ws->on('handshake', function (Swoole\Http\Request $req, Swoole\Http\Response $resp) { // 移除默认Server头 $resp->header('Server', null); // 若要替换为自定义值,改用下行代码即可 // $resp->header('Server', 'XYZ'); // 必须补全标准WebSocket握手所需的响应逻辑,否则握手会失败 $key = $req->header['sec-websocket-key']; $accept = base64_encode(sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true)); $resp->header('Upgrade', 'websocket'); $resp->header('Connection', 'Upgrade'); $resp->header('Sec-WebSocket-Accept', $accept); $resp->header('Sec-WebSocket-Version', '13'); $resp->status(101); $resp->end(); });
注意:自行实现
handshake回调时,必须严格遵循WebSocket协议规范返回握手响应,否则会导致客户端连接失败。仅需修改Server头的场景优先使用第一种配置项方案。
内容的提问来源于stack exchange,提问作者Rajan Sharma
相关产品推荐
相关产品推荐

