← 中文资源

简体中文版本

按 RFC 1123 标签规则校验主机名

逐段验证 DNS 主机名的长度、允许字符和连字符位置,并支持可选的末尾根域点。

阅读英文原文

功能说明

主机名校验不能只依赖点号拆分,还要限制每段长度、首尾字符和总长度。该函数按 RFC 1123 检查字母、数字和内部连字符,允许末尾根域点,并拒绝空标签与超过 253 字符的名称。它适合在连接数据库、配置代理或提交域名表单前做快速校验。

关键代码

先去掉可选的末尾点,再检查总长度。split 后逐段验证长度 1 到 63,并使用正则要求首尾为字母或数字,中间可含连字符。空标签、下划线、空格和中文域名都会失败。函数返回布尔值,只有输入类型错误时才抛异常。

return value.split(".").every((label) => {
  if (label.length < 1 || label.length > 63) return false;
  return /^[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(label);
});

使用注意

该函数只验证 ASCII 主机名,不接受国际化域名的 Unicode 形式,调用前应先转换为 punycode。它不检查 DNS 解析、保留域名或端口。单个标签如 localhost 会通过。末尾点只允许一个,多个末尾点会产生空标签并失败。长度按 JavaScript 字符串字符数计算。

验证方式

断言 isValidHostname(“api.example.com”) 为 true,带末尾点的同一名称也为 true。以连字符开头、包含连续点或 64 字符标签的输入为 false。非字符串输入抛 TypeError。下划线、空格和中文域名应返回 false。总长度超过 253 时返回 false。