C#中URL的顶级域名

时间:2011-01-10 02:28:22

标签: c# asp.net string dns tld

我正在使用C#和ASP.NET。

我们在IIS 6.0服务器上收到很多“奇怪”的请求,我想按域记录和编目。

EG。我们得到了一些奇怪的请求:

http://www.poker.winner4ever.example.com/

http://www.hotgirls.example.com/

http://santaclaus.example.com/

http://m.example.com/

http://wap.example.com/

http://iphone.example.com/

后三者有点显而易见,但我想把它们全部整理成一个“example.com”IS托管在我们的服务器上。其余的不是,抱歉: - )

所以我正在寻找一些关于如何从上面检索example.com的好主意。其次,我想将m。,wap。,iphone等匹配到一个组中,但这可能只是在移动快捷键列表中快速查找。我可以手动编码此列表。

但是regexp是这里的答案还是纯粹的字符串操作最简单的方法?我在考虑将URL字符串“拆分”为“。”并查找项目[0]和项目[1] ...

有什么想法吗?

8 个答案:

答案 0 :(得分:10)

以下代码使用Uri类获取主机名,然后通过在句点上拆分主机名从Uri.Host获取第二级主机(examplecompany.com)。

var uri = new Uri("http://www.poker.winner4ever.examplecompany.com/");
var splitHostName = uri.Host.Split('.');
if (splitHostName.Length >= 2)
{
    var secondLevelHostName = splitHostName[splitHostName.Length - 2] + "." +
                              splitHostName[splitHostName.Length - 1];
}

答案 1 :(得分:6)

可能有一些示例会返回除所需内容之外的其他内容,但国家/地区代码是唯一的2个字符,并且它们可能具有或不具有通常使用的短二级(2或3个字符)。因此,在大多数情况下,这将为您提供所需的内容:

String GetRootDomain(String host)
    {
        String[] domains = host.Split('.');

        if (domains.Length >= 3)
        {
            int c = domains.Length;
            // handle international country code TLDs 
            // www.amazon.co.uk => amazon.co.uk
            if (domains[c - 1].Length < 3 && domains[c - 2].Length <= 3)
                return String.Join(".", domains, c - 3, 3);
            else
                return String.Join(".", domains, c - 2, 2);
        }
        else
            return host;
    }

答案 2 :(得分:4)

如果没有不同域级别的最新数据库,这是不可能的。

考虑:

s1.moh.gov.cn
moh.gov.cn
s1.google.com
google.com

然后你想在哪个级别获得域名?这完全取决于TLDSLDccTLD ...因为ccTLD在国家的控制之下,他们可能会定义非常特殊的SLD你。

答案 3 :(得分:3)

我需要相同,所以我写了一个类,你可以复制并粘贴到你的解决方案中。它使用tld的硬编码字符串数组。 http://pastebin.com/raw.php?i=VY3DCNhp

Console.WriteLine(GetDomain.GetDomainFromUrl("http://www.beta.microsoft.com/path/page.htm"));

输出microsoft.com

Console.WriteLine(GetDomain.GetDomainFromUrl("http://www.beta.microsoft.co.uk/path/page.htm"));

输出microsoft.co.uk

答案 4 :(得分:3)

您可以使用以下nuget Nager.PublicSuffix包。

<强>的NuGet

PM> Install-Package Nager.PublicSuffix

示例

var domainParser = new DomainParser(new WebTldRuleProvider());

var domainName = domainParser.Get("sub.test.co.uk");
//domainName.Domain = "test";
//domainName.Hostname = "sub.test.co.uk";
//domainName.RegistrableDomain = "test.co.uk";
//domainName.SubDomain = "sub";
//domainName.TLD = "co.uk";

答案 5 :(得分:1)

使用正则表达式:

^https?://([\w./]+[^.])?\.?(\w+\.(com)|(co.uk)|(com.au))$

这将匹配以您感兴趣的TLD结尾的任何网址。根据需要扩展列表。此外,捕获组将分别包含子域,主机名和TLD。

答案 6 :(得分:1)

我已经编写了library用于.NET 2+以帮助挑选URL的域组件。

有关github的更多详细信息,但与以前的选项相比,它可以自动从http://publicsuffix.org下载最新数据(每月一次),因此库的输出应该或多或少相同使用Web浏览器用于建立域安全边界的输出(即非常好)。

它还不完美但适合我的需求,不应该花很多工作来适应其他用例,所以如果你愿意,请分叉并发送拉取请求。

答案 7 :(得分:0)

uri.Host.ToLower().Replace("www.","").Substring(uri.Host.ToLower().Replace("www.","").IndexOf('.'))
  • 返回“.com”

    Uri uri = new Uri("http://stackoverflow.com/questions/4643227/top-level-domain-from-url-in-c");

  • 返回“.co.jp” Uri uri = new Uri("http://stackoverflow.co.jp");

  • 返回“.s1.moh.gov.cn” Uri uri = new Uri("http://stackoverflow.s1.moh.gov.cn");