49 lines
1.1 KiB
Go
49 lines
1.1 KiB
Go
package service
|
|
|
|
import (
|
|
"net"
|
|
"net/url"
|
|
"strings"
|
|
)
|
|
|
|
// NormalizeSiteDomain 接受域名、主机名或完整 URL,统一为小写主机名。
|
|
func NormalizeSiteDomain(raw string) string {
|
|
raw = strings.TrimSpace(strings.ToLower(raw))
|
|
if raw == "" {
|
|
return ""
|
|
}
|
|
if !strings.Contains(raw, "://") {
|
|
raw = "https://" + raw
|
|
}
|
|
parsed, err := url.Parse(raw)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
host := strings.TrimSuffix(parsed.Hostname(), ".")
|
|
if host == "" {
|
|
return ""
|
|
}
|
|
if ip := net.ParseIP(host); ip == nil && !strings.Contains(host, ".") && host != "localhost" {
|
|
return ""
|
|
}
|
|
return host
|
|
}
|
|
|
|
func PageHost(rawURL string) string {
|
|
parsed, err := url.Parse(strings.TrimSpace(rawURL))
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return strings.TrimSuffix(strings.ToLower(parsed.Hostname()), ".")
|
|
}
|
|
|
|
// SiteDomainMatches 同时兼容带 www 与不带 www 的主机名。
|
|
func SiteDomainMatches(siteDomain, pageURL string) bool {
|
|
expected := NormalizeSiteDomain(siteDomain)
|
|
actual := PageHost(pageURL)
|
|
if expected == "" || actual == "" {
|
|
return expected == ""
|
|
}
|
|
return strings.TrimPrefix(expected, "www.") == strings.TrimPrefix(actual, "www.")
|
|
}
|