【问题标题】:Extract domain from url (including the hard ones) [duplicate]从 url 中提取域(包括硬域)[重复]
【发布时间】:2011-02-01 09:41:26
【问题描述】:

我正在尝试编写(或只是找到一个现有的)可以获取链接并提取 url 的 PHP 方法。诀窍是,它需要承受看起来很奇怪的域的重压,例如:

www.champa.kku.ac.th 

我自己用肉眼看这个,我还是猜错了:以为域是kku.ac.th,但访问时会出现dns错误。

所以任何人都知道从 url 中可靠地提取域的好方法:

http://site.com/hello.php
http://site.com.uk/hello.php
http://subdomain.site.com/hello.php
http://subdomain.site.com.uk/hello.php
http://www.champa.kku.ac.th/hello.php // and even the one I couldn't tell

【问题讨论】:

  • whois 说 kku.ac.th 是域。我猜他们没有为网络浏览器设置正确的 DNS 记录(而不是 MX 等)。
  • 我认为 A record 是我一直在寻找的术语!
  • @Martin,感谢您指出这一点。
  • 通过您的 Web 服务器(例如 apache/nginx/iis)传递一个环境变量,以像 $_SERVER['SERVER_NAME'] 一样跟踪。我使用 $_SERVER['HOST_ROOT'] 来存储站点库。然后你可以检查 parse_url($url)['host'] 的 END 与 strpos 的 HOST_ROOT 并将其余部分放入 $subdomains = explode('.', $theRest);

标签: php dns subdomain


【解决方案1】:

也许 parse_url 函数会有所帮助,在这里?


在您的情况下,使用这些 URL,代码的以下部分:

echo parse_url('http://site.com/hello.php', PHP_URL_HOST) . '<br />';
echo parse_url('http://site.com.uk/hello.php', PHP_URL_HOST) . '<br />';
echo parse_url('http://subdomain.site.com/hello.php', PHP_URL_HOST) . '<br />';
echo parse_url('http://subdomain.site.com.uk/hello.php', PHP_URL_HOST) . '<br />';
echo parse_url('http://www.champa.kku.ac.th/hello.php', PHP_URL_HOST) . '<br />';

给出这个输出:

site.com
site.com.uk
subdomain.site.com
subdomain.site.com.uk
www.champa.kku.ac.th

【讨论】:

  • 感谢 Pascal,它解决了我的一些问题,非常感谢,但这并不是我所关心的。 Pekka 把它钉得更牢了,所以我可能会为未来的读者选择他的答案。
【解决方案2】:

PHP 具有parse_url() 函数,可以帮助您将基本的拆分为协议、主机、端口等。

至于在不确定的情况下提取“正确”域,这很难说,因为有时,“两部分 TLD”是 TLD 机构的措施(例如在英国),有时是私营企业(例如.uk.com)。我认为您不会绕过维护具有两个部分的顶级域列表,例如

  • .co.uk
  • .ac.uk
  • .ac.th

这些结尾将被视为 TLD(顶级 级域),吞下第二部分。

这是可靠区分“两部分 TLD”(如 .co.uk)的唯一方法 - 其中 server1.ibm.co.uk(需要删除两部分 .co.uk 以确定域本身)与常规子像server1.ibm.com 这样的域(需要删除.com)。

获取许多重要的“两部分 TLD”列表的一个很好的起点是在 speednames.com 上进行域搜索(在国家/地区选择“全部”)。更完整的列表可以在part of the Ruby domainatrix library找到。

【讨论】:

  • 关于“我认为您不会绕过维护包含两个部分的顶级域列表”我也在想同样的事情。 有一个列表吗?我试过维基百科,只能找到普通列表en.wikipedia.org/wiki/List_of_Internet_top-level_domains
  • @karl 我认为没有官方名单,因为其中许多是私营企业。查看 speednames,他们的产品组合中有很多“两部分 TLD”。我认为这是一个好的开始。
【解决方案3】:

借助 Ruby,您可以使用 Domainatrix 库/gem

http://www.pauldix.net/2009/12/parse-domains-from-urls-easily-with-domainatrix.html

需要“红宝石” 需要“域矩阵” s = 'http://www.champa.kku.ac.th/dir1/dir2/file?option1&option2' url = Domainatrix.parse(s) url.domain => “kku”

很棒的工具! :-)

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 2017-10-22
    • 2021-04-12
    • 2010-10-24
    • 2013-09-17
    • 1970-01-01
    • 2017-12-14
    • 2014-08-07
    • 2015-09-27
    相关资源
    最近更新 更多