从php服务器获取根DNS条目;获取没有www的域名,等等

从php服务器获取根DNS条目;获取没有www的域名,等等,php,dns,subdomain,tld,Php,Dns,Subdomain,Tld,如何从$\u服务器['HTTP\u主机]获取根DNS条目 输入: example.co.uk www.example.com blog.example.com forum.example.co.uk 输出: example.co.uk example.com example.com example.co.uk 编辑: 查找列表是我认为这有点定义不清 您可以尝试对每个父记录进行DNS查找,直到找到一个不返回A记录的记录。正如您所发现的,一些国家只使用TLD(例如:.tv、.us),其他国家细

如何从
$\u服务器['HTTP\u主机]
获取根DNS条目

输入:

example.co.uk
www.example.com
blog.example.com
forum.example.co.uk 
输出:

example.co.uk
example.com
example.com
example.co.uk
编辑:
查找列表是

我认为这有点定义不清


您可以尝试对每个父记录进行DNS查找,直到找到一个不返回A记录的记录。

正如您所发现的,一些国家只使用TLD(例如:.tv、.us),其他国家细分其国家TLD(例如:英国)

理想情况下,您需要一个已批准TLD的查找列表(不会很长),如果细分,还需要每个细分的TLD(例如“.co.uk”而不是“.uk”)。这将告诉你哪些“点”(从右边)要保留。然后把一个点移到左边(如果找到的话),然后把前面的所有东西都切掉

在没有查找列表的情况下,您可以利用以下事实:细分(.co等)仅适用于国家(具有两个字母的TLD),并且其本身不会超过3个字符,并且始终是字母,因此您可能可以使用正则表达式模式识别它们

编辑:无论如何,实际的公共后缀列表要复杂得多。您需要使用查找表来确定后缀是什么,返回到上一个点,然后向左修剪。RegEx在这里是一个糟糕的解决方案。相反,将后缀列表存储在字典中,然后对照你的域名进行测试,从左边一次删除一个虚线部分,直到找到匹配的后缀,然后将刚刚删除的部分加回去

/[^\.]+\.[escaped|list|of|domains]$/
我认为这应该行得通。

注意:正如评论中所指出的,这种方法实际上并不适用于所有情况。这是因为一些顶级域确实解析为IP地址,即使大多数域没有解析。因此,仅仅通过检查给定名称是否具有IP地址,就不可能检测出该名称是顶级域名还是伪顶级域名。不幸的是,这可能意味着唯一的解决方案是查找列表,因为顶级域在实践中的处理方式是不一致的。

我重复一遍:不要依赖下面的代码为您工作。我把它留在这里只是为了教育目的。

有一种方法可以在没有查找列表的情况下执行此操作。该列表可能不可靠或不完整,但该方法保证有效:

<?php

function get_domain($url) {
    $dots = substr_count($url, '.');
    $domain = '';

    for ($end_pieces = $dots; $end_pieces > 0; $end_pieces--) {
        $test_domain = end(explode('.', $url, $end_pieces));

        if (dns_check_record($test_domain, 'A')) {
            $domain = $test_domain;
            break;
        }
    }

    return $domain;
}

$my_domain = get_domain('www.robknight.org.uk');

echo $my_domain;

?>

在本例中,它将输出“robknight.org.uk”。它同样适用于.com、.edu、.com.au、.ly或任何其他顶级域

它的工作原理是从右边开始,对第一件看起来可能是可行域名的事情进行DNS检查。在上面的示例中,它以“org.uk”开头,但发现这不是一个实际的域名,而是一个ccTLD。然后检查“robknight.org.uk”,它是有效的,并返回该值。如果域名是,比如说,'www.php.net',它会先检查'php.net',这是一个有效的域名,并会立即返回,而不会循环。我还应该指出,如果没有找到有效的域名,将返回一个空字符串(“”)

由于DNS查找所需的时间,此代码可能不适合在短时间内处理大量域名,但对于单个查找或非时间关键的代码来说,它是完全合适的。

对于此项目:

用法:

echo parallel_get_domain("www.robknight.org.uk") . "<br>";
echo parallel_get_domain("www.google.com") . "<br>";
echo parallel_get_domain("www.yahoo.com") . "<br>";
输出-Linux:

robknight.org.uk
google.com
yahoo.com

更好的方法是,继续查找DNS树,直到找到SOA记录。然而,尽管这在理论上听起来是一个好主意,但在实践中却不起作用(我试过一次,但是有太多的DNS配置被破坏了)。这是一个非常大的列表,然后创建一个树或其他名称。将结果存储在DB中是一个不错的选择;可能想将类型设置为“A”。示例代码不起作用,但我认为您给了我足够的时间让它工作。是一个真正的网站。一旦我得到了一个工作的解决方案,这个线程的工作代码就会很奇怪,示例代码对我来说工作得很好。org.uk不是一个网站,也不能解析为IP(参见示例)。唯一不好的一面是,您的ISP可能在DNS上做了一些奇怪的事情,例如将您重定向到无法解析的域名的门户/搜索站点(类似于OpenDNS)。解释中有许多错误:“org.uk”不是ccTLD,“org.uk”是实际域名,甚至是非空域名(有一个SOA记录和许多NS记录)就提问者试图做的事情而言,据我所知,重要的是org.uk不能解析为IP地址。
org.uk
google.com
yahoo.com
robknight.org.uk
google.com
yahoo.com