diff --git a/sub/subService.go b/sub/subService.go index 42713756..ae530597 100644 --- a/sub/subService.go +++ b/sub/subService.go @@ -202,8 +202,13 @@ func (s *SubService) genVmessLink(inbound *model.Inbound, email string) string { case "ws": ws, _ := stream["wsSettings"].(map[string]interface{}) obj["path"] = ws["path"].(string) - headers, _ := ws["headers"].(map[string]interface{}) - obj["host"] = searchHost(headers) + obj["host"] = ws["host"].(string) + if headers, ok := ws["headers"].(map[string]interface{}); ok { + hostFromHeaders := searchHost(headers) + if hostFromHeaders != "" { + obj["host"] = hostFromHeaders + } + } case "http": obj["net"] = "h2" http, _ := stream["httpSettings"].(map[string]interface{}) @@ -343,7 +348,13 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string { ws, _ := stream["wsSettings"].(map[string]interface{}) params["path"] = ws["path"].(string) headers, _ := ws["headers"].(map[string]interface{}) - params["host"] = searchHost(headers) + params["host"] = ws["host"].(string) + if headers != nil { + hostFromHeaders := searchHost(headers) + if hostFromHeaders != "" { + params["host"] = hostFromHeaders + } + } case "http": http, _ := stream["httpSettings"].(map[string]interface{}) params["path"] = http["path"].(string) @@ -560,7 +571,13 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string ws, _ := stream["wsSettings"].(map[string]interface{}) params["path"] = ws["path"].(string) headers, _ := ws["headers"].(map[string]interface{}) - params["host"] = searchHost(headers) + params["host"] = ws["host"].(string) + if headers != nil { + hostFromHeaders := searchHost(headers) + if hostFromHeaders != "" { + params["host"] = hostFromHeaders + } + } case "http": http, _ := stream["httpSettings"].(map[string]interface{}) params["path"] = http["path"].(string) @@ -778,7 +795,13 @@ func (s *SubService) genShadowsocksLink(inbound *model.Inbound, email string) st ws, _ := stream["wsSettings"].(map[string]interface{}) params["path"] = ws["path"].(string) headers, _ := ws["headers"].(map[string]interface{}) - params["host"] = searchHost(headers) + params["host"] = ws["host"].(string) + if headers != nil { + hostFromHeaders := searchHost(headers) + if hostFromHeaders != "" { + params["host"] = hostFromHeaders + } + } case "http": http, _ := stream["httpSettings"].(map[string]interface{}) params["path"] = http["path"].(string) diff --git a/web/assets/js/model/outbound.js b/web/assets/js/model/outbound.js index 708728a8..aa83287c 100644 --- a/web/assets/js/model/outbound.js +++ b/web/assets/js/model/outbound.js @@ -194,6 +194,7 @@ class WsStreamSettings extends CommonClass { static fromJson(json={}) { return new WsStreamSettings( json.path, + json.host, json.headers && !ObjectUtil.isEmpty(json.headers.Host) ? json.headers.Host : '', ); } @@ -201,6 +202,7 @@ class WsStreamSettings extends CommonClass { toJson() { return { path: this.path, + host: this.host, headers: ObjectUtil.isEmpty(this.host) ? undefined : {Host: this.host}, }; } diff --git a/web/assets/js/model/xray.js b/web/assets/js/model/xray.js index 9d863798..40e435cc 100644 --- a/web/assets/js/model/xray.js +++ b/web/assets/js/model/xray.js @@ -338,10 +338,11 @@ class KcpStreamSettings extends XrayCommonClass { } class WsStreamSettings extends XrayCommonClass { - constructor(acceptProxyProtocol=false, path='/', headers=[]) { + constructor(acceptProxyProtocol=false, path='/', host='', headers=[]) { super(); this.acceptProxyProtocol = acceptProxyProtocol; this.path = path; + this.host = host; this.headers = headers; } @@ -366,6 +367,7 @@ class WsStreamSettings extends XrayCommonClass { return new WsStreamSettings( json.acceptProxyProtocol, json.path, + json.host, XrayCommonClass.toHeaders(json.headers), ); } @@ -374,6 +376,7 @@ class WsStreamSettings extends XrayCommonClass { return { acceptProxyProtocol: this.acceptProxyProtocol, path: this.path, + host: this.host, headers: XrayCommonClass.toV2Headers(this.headers, false), }; } @@ -1108,7 +1111,12 @@ class Inbound extends XrayCommonClass { if (this.isTcp) { return this.stream.tcp.request.getHeader("Host"); } else if (this.isWs) { - return this.stream.ws.getHeader("Host"); + const hostHeader = this.stream.ws.getHeader("Host"); + if (hostHeader !== null) { + return hostHeader; + } else { + return this.stream.ws.host; + } } else if (this.isH2) { return this.stream.http.host[0]; } else if (this.isHttpupgrade) { @@ -1230,6 +1238,7 @@ class Inbound extends XrayCommonClass { } else if (network === 'ws') { let ws = this.stream.ws; obj.path = ws.path; + obj.host = ws.host; let index = ws.headers.findIndex(header => header.name.toLowerCase() === 'host'); if (index >= 0) { obj.host = ws.headers[index].value; @@ -1300,6 +1309,7 @@ class Inbound extends XrayCommonClass { case "ws": const ws = this.stream.ws; params.set("path", ws.path); + params.set("host", ws.host); const index = ws.headers.findIndex(header => header.name.toLowerCase() === 'host'); if (index >= 0) { const host = ws.headers[index].value; @@ -1420,6 +1430,7 @@ class Inbound extends XrayCommonClass { case "ws": const ws = this.stream.ws; params.set("path", ws.path); + params.set("host", ws.host); const index = ws.headers.findIndex(header => header.name.toLowerCase() === 'host'); if (index >= 0) { const host = ws.headers[index].value; @@ -1507,6 +1518,7 @@ class Inbound extends XrayCommonClass { case "ws": const ws = this.stream.ws; params.set("path", ws.path); + params.set("host", ws.host); const index = ws.headers.findIndex(header => header.name.toLowerCase() === 'host'); if (index >= 0) { const host = ws.headers[index].value; diff --git a/web/html/xui/form/stream/stream_httpupgrade.html b/web/html/xui/form/stream/stream_httpupgrade.html index 15c02aeb..31897804 100644 --- a/web/html/xui/form/stream/stream_httpupgrade.html +++ b/web/html/xui/form/stream/stream_httpupgrade.html @@ -3,11 +3,11 @@ - - - + + + {{end}} diff --git a/web/html/xui/form/stream/stream_ws.html b/web/html/xui/form/stream/stream_ws.html index 62380e94..44ebca8d 100644 --- a/web/html/xui/form/stream/stream_ws.html +++ b/web/html/xui/form/stream/stream_ws.html @@ -3,6 +3,9 @@ + + +