把所有 WebSocket Headers(User-Agent、Host 等)一次性拼成一条“ws-headers= …”,并用 “|” 作为分隔符,形如:
因此我们不能再把每个 header 单独推一行,而是先把所有 header 拼成一条,然后一次 push。下面给出可直接替换原来那段判 wsSettings['headers'] 的代码块:
if ($server['network'] === 'ws') {
array_push($config, 'ws=true');
if ($server['networkSettings']) {
$wsSettings = $server['networkSettings'];
// 1. 如果有 path
if (!empty($wsSettings['path'])) {
array_push($config, "ws-path={$wsSettings['path']}");
}
// 2. 如果指定了 headers(可能有多条)
if (!empty($wsSettings['headers']) && is_array($wsSettings['headers'])) {
// 把每个 header 转成 key:"value"
$pairs = [];
foreach ($wsSettings['headers'] as $k => $v) {
if (strval($v) !== '') { // 空值就不拼
$pairs[] = $k . ':"' . str_replace('"', '\"', $v) . '"';
}
}
if (!empty($pairs)) {
$headerLine = 'ws-headers=' . implode('|', $pairs);
array_push($config, $headerLine);
}
}
}
}
举个例子
假设:
$wsSettings['headers'] = [
'Host' => '456.123.xyz',
'User-Agent' => 'chrome',
'Accept-Language' => 'en-US',
];
则最终 $config 里相应的那一行就是:
ws-headers=Host:"456.123.xyz"|User-Agent:"chrome"|Accept-Language:"en-US"
如需保留原来的 Host 专属判断或其他逻辑,只要把上面“拼 $pairs”的部分插进去即可。