Домен верхнего уровня из URL в C # - PullRequest
12 голосов
/ 10 января 2011

Я использую C # и ASP.NET для этого.

Мы получаем много «странных» запросов на наших серверах 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 и т. Д. В группу, но это, вероятно, просто быстрый поиск в списке мобильных ярлыков. Я мог бы для начала вручную написать этот список.

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

Есть идеи?

Ответы [ 8 ]

10 голосов
/ 10 января 2011

Следующий код использует класс 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];
}
6 голосов
/ 05 февраля 2016

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

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

Рассмотрим:

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

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

3 голосов
/ 27 октября 2016

Вы можете использовать следующий 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";
3 голосов
/ 13 февраля 2011

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

1 голос
/ 02 июля 2015

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

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

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

1 голос
/ 10 января 2011

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

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

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

0 голосов
/ 18 февраля 2011
uri.Host.ToLower().Replace("www.","").Substring(uri.Host.ToLower().Replace("www.","").IndexOf('.'))

и т.д.

...