首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从URL获取子域

从URL获取子域
EN

Stack Overflow用户
提问于 2008-11-13 23:54:06
回答 12查看 54.6K关注 0票数 109

从URL获取子域起初听起来很简单。

代码语言:javascript
复制
http://www.domain.example

扫描第一段,然后返回"http://“...”之后的内容。

然后你就会记得

代码语言:javascript
复制
http://super.duper.domain.example

噢。然后你会想,好吧,找到最后一个句号,返回一个单词,然后得到之前的所有内容!

然后你就会记得

代码语言:javascript
复制
http://super.duper.domain.co.uk

你又回到原点了。除了存储所有TLD的列表之外,还有谁有什么好主意呢?

EN

回答 12

Stack Overflow用户

发布于 2008-11-14 00:32:13

正如Adam所说,这并不容易,目前唯一实用的方法是使用列表。

即使这样也有例外-例如,在.uk中,有少数域名在该级别上立即有效,但在.co.uk中不是,所以这些域名必须作为例外添加。

这是目前主流浏览器的做法--有必要确保example.co.uk不能为.co.uk设置Cookie,然后它会被发送到.co.uk下的任何其他网站。

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

IETF中还有一些工作是为了创建某种标准,以允许TLD声明它们的域结构。这对于像.uk.com这样的人来说有点复杂,它的操作就好像它是一个公共后缀,但并不是由.com注册中心出售的。

票数 25
EN

Stack Overflow用户

发布于 2013-02-04 22:33:27

正如亚当和约翰已经说过的那样,publicsuffix.org是正确的方式。但是,如果由于任何原因,你不能使用这种方法,这里有一个启发式的假设,适用于99%的所有领域:

有一个属性可以区分(不是全部,但几乎所有)“真正”域与子域和TLD,那就是DNS的MX记录。您可以创建一个算法来搜索以下内容:逐个删除主机名的各个部分,并查询DNS,直到找到MX记录。示例:

代码语言:javascript
复制
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

下面是一个用php编写的例子:

代码语言:javascript
复制
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");
}
票数 9
EN

Stack Overflow用户

发布于 2012-12-07 02:43:25

对于C库(使用Python语言生成数据表),我编写了http://code.google.com/p/domain-registry-provider/,它既快又节省空间。

该库对数据表使用~30kB,对C代码使用~10kB。因为表是在编译时构造的,所以没有启动开销。有关更多详细信息,请参阅http://code.google.com/p/domain-registry-provider/wiki/DesignDoc

为了更好地理解表生成代码(Python),从这里开始:http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/registry_tables_generator/registry_tables_generator.py

要更好地理解C API,请参阅:http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/domain_registry/domain_registry.h

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/288810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档