|
@@ -168,9 +168,21 @@ func validateHostPort(fl validator.FieldLevel) bool {
|
|
|
if portInt <= 0 || portInt > 65535 {
|
|
|
return false
|
|
|
}
|
|
|
- // 如果不是 IP,则检查它是否为有效的主机名 (使用 validator 内置的 hostname_rfc1123 逻辑)
|
|
|
- // 我们不能直接调用,但可以通过 Var 来间接使用它
|
|
|
- err = getInstance().Var(host, "hostname_rfc1123")
|
|
|
+
|
|
|
+ // --- 如果不是 IP,则按域名处理(这是支持中文域名的关键部分) ---
|
|
|
+
|
|
|
+ // 4. 将可能为中文的域名转换为 Punycode (ASCII) 格式
|
|
|
+ // 例如: "例子.com" -> "xn--fsq270a.com"
|
|
|
+ asciiHost, err := idna.ToASCII(host)
|
|
|
+ if err != nil {
|
|
|
+ // 如果转换失败,说明主机名包含无效字符(如下划线 "_" 等),不是合法的域名
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ // 5. 使用 validator 内置的 hostname_rfc1123 规则来验证转换后的 ASCII 域名
|
|
|
+ // RFC 1123 是对主机名规范的常见标准。
|
|
|
+ // 注意:我们验证的是 asciiHost,而不是原始的 host。
|
|
|
+ v := getInstance()
|
|
|
+ err = v.Var(asciiHost, "fqdn")
|
|
|
return err == nil
|
|
|
}
|
|
|
|