为什么 .dev、.app、.page(以及其他 40 多个顶级域)不响应 WHOIS
Source: Dev.to
请提供您希望翻译的正文内容,我将为您翻译成简体中文。
Source:
调查
第一想法:也许 Google 会阻止对其域名的 WHOIS 查询?我们来检查一下 .dev 的 WHOIS 服务器:
whois -h whois.iana.org dev
输出(已截取):
domain: DEV
organisation: Charleston Road Registry Inc.
...
whois:
status: ACTIVE
remarks: Registration information: https://www.registry.google
注意空的 whois: 字段——.dev 没有 WHOIS 服务器。
Google 拥有 40 多个顶级域名,而它们都没有 WHOIS 服务器,例如:
.app、.page、.new、.google、.youtube、.android、.chrome、.zip、.mov、.dad、.phd、.prof、.meme、.foo、.nexus、.rsvp、.fly、.ing、.boo、.channel…
你可以在 IANA 的根数据库 中验证任何顶级域名——查看 “WHOIS Server” 字段。这不是 bug,而是设计如此。
为什么没有 WHOIS?
Google 在 2012 年后推出这些顶级域名,当时 ICANN 开始推广一种新协议 RDAP(注册数据访问协议)。
WHOIS 的主要问题是缺乏统一的格式——注册商返回的文本、字段名称和日期格式各不相同。
RDAP 解决了这些问题:
- JSON 响应 – 不再需要解析随机的文本格式,只需
json.Unmarshal。 - 标准化字段名称 – 到期日期始终为
eventAction: "expiration"。 - RESTful API – 任何 HTTP 客户端只需发送一个 GET 请求即可。
2025 年 1 月,ICANN 正式停止 gTLD 的 WHOIS 服务。RDAP 已成为标准。
如何使用 RDAP 检查域名过期
如果你想监控域名的到期时间或构建查询工具,RDAP 是首选。下面是一个可运行的 Go 示例:
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
"strings"
"time"
)
func main() {
domain := "google.dev"
if len(os.Args) > 1 {
domain = os.Args[1]
}
expiry, err := getExpiry(domain)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
days := int(time.Until(expiry).Hours() / 24)
fmt.Printf("%s expires %s (%d days)\n", domain, expiry.Format("2006-01-02"), days)
}
func getExpiry(domain string) (time.Time, error) {
tld := domain[strings.LastIndex(domain, ".")+1:]
// RDAP endpoints (from IANA bootstrap file)
endpoints := map[string]string{
"com": "https://rdap.verisign.com/com/v1/domain/",
"net": "https://rdap.verisign.com/net/v1/domain/",
"org": "https://rdap.publicinterestregistry.org/rdap/domain/",
"dev": "https://pubapi.registry.google/rdap/domain/",
"app": "https://pubapi.registry.google/rdap/domain/",
"io": "https://rdap.nic.io/domain/",
}
endpoint, ok := endpoints[tld]
if !ok {
return time.Time{}, fmt.Errorf("unknown TLD: %s", tld)
}
resp, err := http.Get(endpoint + domain)
if err != nil {
return time.Time{}, err
}
defer resp.Body.Close()
var data struct {
Events []struct {
Action string `json:"eventAction"`
Date string `json:"eventDate"`
} `json:"events"`
}
if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
return time.Time{}, err
}
for _, e := range data.Events {
if e.Action == "expiration" {
return time.Parse(time.RFC3339, e.Date)
}
}
return time.Time{}, fmt.Errorf("no expiration date found")
}
运行它:
$ go run main.go google.dev
google.dev expires 2025-09-14 (252 days)
$ go run main.go github.com
github.com expires 2026-10-09 (642 days)
干净的 JSON,标准字段,避免了繁琐的解析。
RDAP 覆盖
所有通用顶级域名(.com、.org、.dev 等)都支持 RDAP。大多数国家代码顶级域名(.uk、.de、.ru 等)仍然依赖 WHOIS,但覆盖率每年都在增长。
完整的 RDAP 端点列表位于IANA 的引导文件;这里可以获取任何顶级域的正确端点。
关键要点
- 新的顶级域(尤其是 Google 的)没有 WHOIS 服务器 – 仅有 RDAP。
- ICANN 在 2025 年废弃 WHOIS – RDAP 是未来。
- RDAP 返回 JSON – 不再需要解析 50 种不同的日期格式。
不想自己处理 RDAP?查看 upsonar.io/docs/domain-expiry – 它会监控域名到期并在到期前提醒。提供免费套餐。
你在监控哪些 TLD?遇到过什么奇怪的边缘情况吗?