PHP域名Whois脚本无法返回联系人信息的技术求助
搞定PHP Whois函数拿不到联系人信息的问题
我懂你遇到的麻烦了——自己写的PHP函数能正常运行,但就是拿不到行政、注册人、技术联系人这些关键信息,可终端敲whois google.com却能拿到全量数据。其实核心问题出在你的PHP函数只做了单次Whois服务器查询,而终端的whois命令会自动帮你做递归查询。
为啥会有这差异?
很多顶级域(比如.com、.net)的根Whois服务器(比如Verisign的服务器)只会返回域名的基础注册信息,然后告诉你得去对应的注册商Whois服务器查详细内容。终端的whois工具会自动识别返回结果里的Registrar WHOIS Server字段,接着自动去查那个服务器;但你的PHP函数只查了第一台服务器,自然拿不到联系人信息。
另外,部分Whois服务器会对脚本类的非交互式请求返回简化数据,这也是一个可能的因素。
改造你的PHP函数,支持递归查询
下面是修改后的函数,它会自动跟进注册商的Whois服务器,直到拿到完整信息:
function QueryWhoisServer($whoisserver, $domain, $depth = 0) { // 防止无限递归,限制最大查询深度 if ($depth > 3) { return "Maximum recursion depth reached"; } $port = 43; $timeout = 10; $fp = @fsockopen($whoisserver, $port, $errno, $errstr, $timeout); if (!$fp) { return "连接出错: $errno - $errstr"; } // Whois协议要求查询末尾必须加换行,有些服务器可能需要特定前缀,比如"domain " fputs($fp, $domain . "\r\n"); $response = ''; while (!feof($fp)) { $response .= fgets($fp); } fclose($fp); // 检查是否存在注册商的Whois服务器地址,有的话递归查询 if (preg_match('/Registrar WHOIS Server: (.*)/i', $response, $matches)) { $registrarWhois = trim($matches[1]); if (!empty($registrarWhois) && $registrarWhois !== $whoisserver) { $response .= "\n--- 注册商Whois数据 ---\n"; $response .= QueryWhoisServer($registrarWhois, $domain, $depth + 1); } } return $response; } // 使用示例:查询google.com,先从IANA根服务器开始 $domain = 'google.com'; $result = QueryWhoisServer('whois.iana.org', $domain); echo nl2br($result);
额外小提示
- 调整查询格式:如果发现返回结果不对,试试把发送的请求改成
"domain " . $domain . "\r\n",有些服务器需要这个前缀。 - 加个User-Agent:部分服务器会拒绝无标识的脚本请求,你可以在发送查询前加一行
fputs($fp, "User-Agent: MyCustomWhois/1.0\r\n");,模拟终端请求。 - 错误处理优化:可以给函数加重试逻辑,或者处理不同服务器的响应格式差异,毕竟不同注册商的Whois返回格式可能不一样。
这样改完之后,你的PHP函数就能像终端命令一样,拿到包含所有联系人信息的完整Whois数据了。
内容的提问来源于stack exchange,提问作者Anakbhai Gida
相关产品推荐
相关产品推荐

