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 @@
+
+
+