Домен верхнего уровня из 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");
и др.