从URL获取子域

jb.*_*jb. 100 subdomain dns url parsing

首先从URL获取子域很容易.

http://www.domain.example
Run Code Online (Sandbox Code Playgroud)

扫描第一个时间段然后返回"http://"之后的任何内容......

然后你记得

http://super.duper.domain.example
Run Code Online (Sandbox Code Playgroud)

哦.所以,你想,好吧,找到最后一个时期,回过头来获取一切!

然后你记得

http://super.duper.domain.co.uk
Run Code Online (Sandbox Code Playgroud)

而你又回到了原点.除了存储所有顶级域名列表外,任何人都有任何好主意吗?

Ada*_*vis 71

除了存储所有顶级域名列表外,任何人都有任何好主意吗?

不,因为每个TLD在子域,二级域等方面都有所不同.

请注意,有顶级域名,二级域名和子域名.从技术上讲,除TLD之外的所有内容都是子域.

在domain.com.uk示例中,domain是子域,com是二级域,uk是tld.

所以问题仍然比乍一看更复杂,这取决于每个TLD的管理方式.您需要一个包含其特定分区的所有TLD的数据库,以及作为二级域和子域的内容.但是,没有太多TLD,因此列表可以合理地管理,但收集所有这些信息并非易事.可能已经有这样的清单.

看起来像http://publicsuffix.org/就是这样一个列表 - 所有常见的后缀(.com,.co.uk等)都在适合搜索的列表中.解析它仍然不容易,但至少你不必维护列表.

"公共后缀"是指互联网用户可以直接注册名称的公共后缀.公共后缀的一些示例是".com",".co.uk"和"pvt.k12.wy.us".公共后缀列表是所有已知公共后缀的列表.

公共后缀列表是Mozilla Foundation的一项举措.它可用于任何软件,但最初是为满足浏览器制造商的需求而创建的.它允许浏览器,例如:

  • 避免为高级域名后缀设置破坏隐私的"超级英雄"
  • 突出显示用户界面中域名最重要的部分
  • 按站点准确排序历史记录条目

仔细查看列表,您可以看到它不是一个小问题.我认为列表是实现这一目标的唯一正确方法......

-亚当


Aln*_*tak 26

正如亚当所说,这并不容易,目前唯一可行的方法是使用清单.

即使这样,也有例外 - 例如,.uk有一些域在该级别立即生效但不在其中.co.uk,因此必须将这些域作为例外添加.

目前这是主流浏览器如何做到这一点 - 有必要确保example.co.uk无法设置Cookie,.co.uk然后将其发送到任何其他网站.co.uk.

好消息是,http://publicsuffix.org/上已有一个列表.

IETF中还有一些工作要创建某种标准,以允许TLD声明其域结构的样子.这有点复杂,虽然.uk.com它们是公共后缀,但不是由.com注册表出售.


Joh*_*ade 21

Publicsuffix.org似乎是这样做的.有很多实现可以轻松地解析publicsuffix数据文件的内容:

  • publicsuffix.org上的列表不是"非官方的",而是Mozilla所做的任何事情.鉴于Mozilla,Opera和Chrome使用它,它不太可能变得无法维护.至于不完整,eu.org这样的域名的任何运营商都可以申请加入,并且他们了解这样做的后果.如果您想要添加域名,请让所有者申请.是的,它不会自动反映TLD政策,但什么都没有 - 没有该信息的程序化来源. (7认同)
  • 但请记住,这不仅仅是解析问题!这份名单在Publicsuffix.org是一个非官方的项目,这是不完整的(eu.org缺失,例如),不会自动反映TLD的政策,并可能随时成为无人维护. (2认同)

Fra*_*ois 9

正如Adam和John所说,publicsuffix.org是正确的方法.但是,如果由于任何原因你不能使用这种方法,这里的启发式基于一个适用于99%的所有域的假设:

有一个属性区分(不是全部,但几乎所有)来自子域和顶级域名的"真实"域名,这是DNS的MX记录.您可以创建一个搜索此算法的算法:逐个删除主机名的各个部分并查询DNS,直到找到MX记录.例:

super.duper.domain.co.uk => no MX record, proceed
duper.domain.co.uk       => no MX record, proceed
domain.co.uk             => MX record found! assume that's the domain
Run Code Online (Sandbox Code Playgroud)

这是php中的一个例子:

function getDomainWithMX($url) {
    //parse hostname from URL 
    //http://www.example.co.uk/index.php => www.example.co.uk
    $urlParts = parse_url($url);
    if ($urlParts === false || empty($urlParts["host"])) 
        throw new InvalidArgumentException("Malformed URL");

    //find first partial name with MX record
    $hostnameParts = explode(".", $urlParts["host"]);
    do {
        $hostname = implode(".", $hostnameParts);
        if (checkdnsrr($hostname, "MX")) return $hostname;
    } while (array_shift($hostnameParts) !== null);

    throw new DomainException("No MX record found");
}
Run Code Online (Sandbox Code Playgroud)