Домен верхнего уровня из URL-адреса в С#

Я использую для этого С# и 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", размещенном на наших серверах. Остальное нет, извините: -)

Итак, я ищу некоторые хорошие идеи о том, как извлечь example.com из вышесказанного. Во-вторых, я хотел бы сопоставить m., Wap., Iphone и т.д. В группе, но это, вероятно, просто быстрый поиск в списке мобильных ярлыков. Я мог бы вручную ввести этот список для запуска.

Но regexp ответ здесь или просто строчная манипуляция - самый простой способ? Я думал о "расщеплении" строки URL ".". и поиск элемента [0] и пункта [1]...

Любые идеи?

Ответ 1

Мне нужно то же самое, поэтому я написал класс, который вы можете скопировать и вставить в свое решение. Он использует строковый массив строк 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

Ответ 2

В следующем коде используется класс 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];
}

Ответ 3

Могут быть некоторые примеры, когда это возвращает что-то отличное от желаемого, но коды стран являются единственными, которые состоят из 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;
}

Ответ 4

Это невозможно без обновленной базы данных разных уровней домена.

Рассмотрим:

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

Затем на каком уровне вы хотите получить домен? Это полностью зависит от TLD, SLD, ccTLD... потому что ccTLD под контролем стран они могут определить особо специальный SLD, который вам неизвестен.

Ответ 5

Вы можете использовать следующий пакет 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";

Ответ 6

Используйте регулярное выражение:

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

Это будет соответствовать любому URL-адресу, заканчивающемуся с TLD, в котором вы заинтересованы. Расширьте список столько, сколько хотите. Кроме того, группы захвата будут содержать субдомен, имя хоста и TLD соответственно.

Ответ 7

Я написал библиотеку для использования в .NET 2+, чтобы помочь выбрать компоненты домена для URL.

Подробнее о github, но одно преимущество по сравнению с предыдущими параметрами заключается в том, что он может автоматически загружать последние данные из http://publicsuffix.org (один раз в месяц), поэтому вывод из библиотеки должен быть более или менее наравне с выходом, используемым веб-браузерами, для установления границ безопасности домена (т.е. довольно хорошо).

Он еще не идеален, но подходит для моих нужд и не должен прикладывать много усилий, чтобы адаптироваться к другим вариантам использования, поэтому, пожалуйста, прокрутите вилку и отправьте запрос на растяжение, если хотите.

Ответ 8

uri.Host.ToLower().Replace("www.","").Substring(uri.Host.ToLower().Replace("www.","").IndexOf('.'))
  • возвращает ".com" для

    Uri uri = new Uri("http://stackoverflow.com/info/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");

и др.