15

我为此使用 C# 和 ASP.NET。

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

例如。我们收到一些奇怪的请求,例如:

后三个有点明显,但我想将它们全部归为一个,因为“example.com”托管在我们的服务器上。其余的不是,对不起:-)

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

但是正则表达式是这里的答案还是纯字符串操作是最简单的方法?我正在考虑用“。”“拆分”URL字符串。并寻找 item[0] 和 item[1]...

有任何想法吗?

4

7 回答 7

16

您可以使用以下 nuget Nager.PublicSuffix包。它使用浏览器供应商使用的相同数据源。

nuget

PM> Install-Package Nager.PublicSuffix

例子

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

var domainInfo = domainParser.Parse("sub.test.co.uk");
//domainInfo.Domain = "test";
//domainInfo.Hostname = "sub.test.co.uk";
//domainInfo.RegistrableDomain = "test.co.uk";
//domainInfo.SubDomain = "sub";
//domainInfo.TLD = "co.uk";
于 2016-10-27T17:59:43.217 回答
11

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

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];
}
于 2011-01-10T02:37:25.853 回答
8

可能有一些示例返回的不是所需的内容,但国家代码是唯一的 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;
}
于 2016-02-04T23:33:12.350 回答
4

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

考虑:

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

那么你想在哪个级别获得域?这完全取决于TLD, SLD, ccTLD... 因为ccTLD在国家的控制下,他们可能会定义SLD您不知道的非常特殊的东西。

于 2011-01-10T05:53:16.137 回答
2

我编写了一个用于 .NET 2+的库,以帮助挑选 URL 的域组件。

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

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

于 2015-07-01T21:12:16.783 回答
1

使用正则表达式:

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

这将匹配以您感兴趣的 TLD 结尾的任何 URL。尽可能多地扩展列表。此外,捕获组将分别包含子域、主机名和 TLD。

于 2011-01-10T04:15:32.673 回答
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");

等等

于 2011-02-18T16:59:08.020 回答