从URL获取子域起初听起来很简单。
http://www.domain.example
扫描第一段,然后返回"http://“...”之后的内容。
然后你就会记得
http://super.duper.domain.example
噢。然后你会想,好吧,找到最后一个句号,返回一个单词,然后得到之前的所有内容!
然后你就会记得
http://super.duper.domain.co.uk
你又回到原点了。除了存储所有TLD的列表之外,还有谁有什么好主意呢?
发布于 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
注册中心出售的。
发布于 2013-02-04 22:33:27
正如亚当和约翰已经说过的那样,publicsuffix.org是正确的方式。但是,如果由于任何原因,你不能使用这种方法,这里有一个启发式的假设,适用于99%的所有领域:
有一个属性可以区分(不是全部,但几乎所有)“真正”域与子域和TLD,那就是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
下面是一个用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");
}
发布于 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
https://stackoverflow.com/questions/288810
复制相似问题