ASP.NET Core Library – Nager.PublicSuffix
前言
有个很简单的需求,想从 URL 里获取到 domain 不要 subdomain。
abc.example.com -> example.com
没想到就这么简单的需求,超级难做。而且 .NET 也没有 build-in 的。
参考:
Get just the domain name from a URL?
Top level domain from URL in C#
Nager.PublicSuffix
最后决定使用 Plugin 来解决,它是基于 https://publicsuffix.org 的,一个所有 avaiable domain 的 list。
用这个就可以非常安全稳当的从 URL 获取到 domain 了。
public static async Task Main() { // 提供 public_suffix_list.dat 文件路径 var localFileRuleProvider = new LocalFileRuleProvider( @"C:\keatkeat\my-projects\asp.net core\8.0\CSharp12\CSharp12\public_suffix_list.dat" ); // 2. 一定要 BuildAsync 后才能使用哦 await localFileRuleProvider.BuildAsync(); var domainParser = new DomainParser(localFileRuleProvider); var domainInfo = domainParser.Parse("sub.test.co.uk"); //domainInfo.Domain = "test"; //domainInfo.Hostname = "sub.test.co.uk"; //domainInfo.RegistrableDomain = "test.co.uk"; //domainInfo.SubDomain = "sub"; //domainInfo.TLD = "co.uk"; }
public_suffix_list.dat 可以到这里下载 https://publicsuffix.org/list/public_suffix_list.dat
上面这个方式是我们提前下载好 .dat 文件,还有另一个方式是通过 HttpClient 直接去下载。
public static async Task Main() { // 1. 创建一个 logger,如果是 Web 项目可以从 DI 拿。 var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()); var logger = loggerFactory.CreateLogger<CachedHttpRuleProvider>(); // 2. 创建一个 ConfigurationBuilder,如果是 Web 项目可以从 DI 拿。 var configuration = new ConfigurationBuilder() // .AddInMemoryCollection(new Dictionary<string, string?>() // { // 3. 如果要覆盖 public_suffix_list.dat 下载地址可以通过 configuration // 下面这个是默认的 // ["Nager:PublicSuffix:DataUrl"] = "https://publicsuffix.org/list/public_suffix_list.dat" // }) .Build(); // 4. 创建 HttpClient // 这个用来发请求的 var httpClient = new HttpClient(); // 5. 创建 CacheProvider // 这个用来缓存的,它默认会把下载到的 public_suffix_list.dat 存在 Path.GetTempPath() 1 天 var cacheProvider = new LocalFileSystemCacheProvider(); var webRuleProvider = new CachedHttpRuleProvider(logger, configuration, cacheProvider, httpClient); var domainParser = new DomainParser(webRuleProvider); var domainInfo = domainParser.Parse("sub.test.co.uk"); //domainInfo.Domain = "test"; //domainInfo.Hostname = "sub.test.co.uk"; //domainInfo.RegistrableDomain = "test.co.uk"; //domainInfo.SubDomain = "sub"; //domainInfo.TLD = "co.uk"; }
默认会把下载到的 public_suffix_list.dat 存在 Path.GetTempPath() 1 天。
这个 temp folder 需要高权限才能访问哦,不然会报错 Access to the path 'C:\Windows\TEMP\publicsuffixcache.dat' is denied。
给 IIS_IUSRS read 权限就可以了。
或者改成放到项目 folder。
var cacheProvider = new LocalFileSystemCacheProvider( cachePath: "wwwroot/..." );