2011-01-10 70 views
11

我正在使用C#和ASP.NET。來自C#中的頂級域名#

我們在IIS 6.0服務器上收到很多「奇怪」的請求,我想按域登錄和編目。

例如,我們得到了一些奇怪的請求這樣的:

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」託管在我們的服務器上。其餘不是,對不起:-)

所以我正在尋找一些好的想法,如何從上面檢索example.com。其次,我希望將m。,wap,iphone等匹配到一個組中,但這可能只是快速查找移動快捷方式列表中的一個。我可以手動編寫此列表作爲開始。

但是這裏是正則表達式的答案還是純字符串操作最簡單的方法?我正在考慮用「。」分割URL字符串。並尋找項目[0]和項目[1] ...

任何想法?

+0

我還需要一個解決方案,將工作做好了co.uk類型域... – Kurru 2011-01-10 03:00:33

+0

我想你應該發現其共同.uk首先,然後爲此特殊情況。並非每個國家都有類似的「頂級/第二級」域名。所以我要先選擇「頂級」選擇,然後再進行排序。 – BerggreenDK 2011-01-10 20:39:49

回答

2

我需要相同的,所以我寫了一個類,您可以複製並粘貼到您的解決方案。它使用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

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]; 
} 
+6

這可能適合於OP的需求,但它不適用於所有域。例如,http://www.google.co.uk/或http://www.bbc.co.uk/的主機名稱將以*「co.uk」*的形式提供。 – LukeH 2011-01-10 02:54:28

+0

@LukeH:非常好的一點。我只是在考慮OP的需求和國家代碼TLD甚至沒有跨過我的腦海: -/ – 2011-01-10 03:08:40

+0

@LukeH - OP已經指定了他感興趣的域名,所以它沒有出現他正在尋找一個通用的解決方案這對任何TLD都有效 - 他說''examplecompany。com「是託管在我們的服務器上」在一般情況下使用正則表達式匹配TLD實際上是非常困難和充滿陷阱的 – 2011-01-10 04:24:55

1

使用正則表達式:

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

這將匹配與您感興趣頂級域名結尾的網址。根據需要擴展列表。此外,捕獲組將分別包含子域,主機名和TLD。

4

沒有不同域級別的最新數據庫,這是不可能的。

考慮:

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

然後在該水平,你想要得到的域?它完全取決於TLDSLD,ccTLD ......因爲ccTLD處於國家的控制之下,因此他們可能會定義非常特殊的SLD,這對您而言是未知的。

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");

1

我寫了一個用於.NET 2+的library以幫助圖片輸出URL的域組件。

更多細節都在github上,但是比之前的選項有一個好處,它可以自動從http://publicsuffix.org下載最新數據(每月一次),所以庫的輸出應該或多或少與輸出一致網頁瀏覽器使用它來建立域安全邊界(即非常好)。

它並不完美,但還沒有適合我的需要,而不是應該採取大量的工作來適應其他使用情況,請叉,如果你想發送pull請求。

4

可能有一些例子,其中該返回比期望其它的東西,但國家代碼是唯一是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; 
    } 
1

您可以使用下面的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";