#3891 fix subscription + json.

This commit is contained in:
Haikiri 2026-03-06 12:03:19 +03:00
parent a2097ad062
commit d72f84f207
2 changed files with 69 additions and 29 deletions

View file

@ -154,10 +154,14 @@ func (s *SubJsonService) getConfig(inbound *model.Inbound, client model.Client,
externalProxies, ok := stream["externalProxy"].([]any) externalProxies, ok := stream["externalProxy"].([]any)
if !ok || len(externalProxies) == 0 { if !ok || len(externalProxies) == 0 {
dest := host
if inbound.Listen != "" && inbound.Listen != "0.0.0.0" && inbound.Listen != "::" && inbound.Listen != "::0" {
dest = inbound.Listen
}
externalProxies = []any{ externalProxies = []any{
map[string]any{ map[string]any{
"forceTls": "same", "forceTls": "same",
"dest": host, "dest": dest,
"port": float64(inbound.Port), "port": float64(inbound.Port),
"remark": "", "remark": "",
}, },

View file

@ -1043,37 +1043,44 @@ func (s *SubService) ResolveRequest(c *gin.Context) (scheme string, host string,
scheme = "https" scheme = "https"
} }
// base host (no port) forwardedHost := getFirstHeaderValue(c.GetHeader("X-Forwarded-Host"))
if h, err := getHostFromXFH(c.GetHeader("X-Forwarded-Host")); err == nil && h != "" { requestHost := strings.TrimSpace(c.Request.Host)
host = h
} // prefer forwarded host set by reverse proxy.
if host == "" { if forwardedHost != "" {
host = c.GetHeader("X-Real-IP") hostWithPort = forwardedHost
} if h, err := getHostFromXFH(forwardedHost); err == nil && h != "" {
if host == "" { host = h
var err error
host, _, err = net.SplitHostPort(c.Request.Host)
if err != nil {
host = c.Request.Host
} }
} }
// host:port for URLs // host:port for URLs from request, if not reverse-proxuy
hostWithPort = c.GetHeader("X-Forwarded-Host")
if hostWithPort == "" { if hostWithPort == "" {
hostWithPort = c.Request.Host hostWithPort = requestHost
}
// resolve bare host from request host if proxy host is absent/invalid.
if host == "" && requestHost != "" {
if h, err := getHostFromXFH(requestHost); err == nil && h != "" {
host = h
}
}
if host == "" && hostWithPort != "" {
if h, err := getHostFromXFH(hostWithPort); err == nil && h != "" {
host = h
}
}
if host == "" {
host = hostWithPort
} }
if hostWithPort == "" { if hostWithPort == "" {
hostWithPort = host hostWithPort = host
} }
// header display host // fix: invalid host header. older: used client ip in header and title.
hostHeader = c.GetHeader("X-Forwarded-Host") hostHeader = host
if hostHeader == "" { if hostHeader == "" {
hostHeader = c.GetHeader("X-Real-IP") hostHeader = hostWithPort
}
if hostHeader == "" {
hostHeader = host
} }
return return
} }
@ -1188,12 +1195,41 @@ func (s *SubService) BuildPageData(subId string, hostHeader string, traffic xray
} }
func getHostFromXFH(s string) (string, error) { func getHostFromXFH(s string) (string, error) {
if strings.Contains(s, ":") { s = getFirstHeaderValue(s)
realHost, _, err := net.SplitHostPort(s) if s == "" {
if err != nil { return "", nil
return "", err
}
return realHost, nil
} }
return s, nil
if strings.Contains(s, "://") {
u, err := url.Parse(s)
if err == nil && u.Host != "" {
s = u.Host
}
}
if strings.HasPrefix(s, "[") {
if realHost, _, err := net.SplitHostPort(s); err == nil {
return strings.Trim(realHost, "[]"), nil
}
return strings.Trim(s, "[]"), nil
}
if strings.Contains(s, ":") && strings.Count(s, ":") == 1 {
if realHost, _, err := net.SplitHostPort(s); err == nil {
return realHost, nil
}
}
return strings.Trim(s, "[]"), nil
}
func getFirstHeaderValue(value string) string {
parts := strings.Split(value, ",")
if len(parts) == 0 {
return ""
}
return strings.TrimSpace(parts[0])
} }