为什么 .dev、.app、.page(以及其他 40 多个顶级域)不响应 WHOIS

发布: (2026年1月7日 GMT+8 03:52)
4 min read
原文: Dev.to

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?遇到过什么奇怪的边缘情况吗?

Back to Blog

相关文章

阅读更多 »

分享我的实操企业云平台项目

我是 Bernardo,一名 Cloud & Network Engineer,很高兴加入这个 DevOps 社区。我想通过分享我目前正在构建的一个实操项目来自我介绍。