我正在使用C#和ASP.NET。
我们在IIS 6.0服务器上收到很多“奇怪”的请求,我想按域记录和编目。
EG。我们得到了一些奇怪的请求:
http://www.poker.winner4ever.example.com/
http://www.hotgirls.example.com/
http://santaclaus.example.com/
后三者有点显而易见,但我想把它们全部整理成一个“example.com”IS托管在我们的服务器上。其余的不是,抱歉: - )
所以我正在寻找一些关于如何从上面检索example.com的好主意。其次,我想将m。,wap。,iphone等匹配到一个组中,但这可能只是在移动快捷键列表中快速查找。我可以手动编码此列表。
但是regexp是这里的答案还是纯粹的字符串操作最简单的方法?我在考虑将URL字符串“拆分”为“。”并查找项目[0]和项目[1] ...
有什么想法吗?
答案 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
然后你想在哪个级别获得域名?这完全取决于TLD
,SLD
,ccTLD
...因为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");
等