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数据文件的内容:
正如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)