在“hosts”文件中确定域名是否有效的最佳方法是什么?

15

Windows的Hosts文件允许您将IP地址与比普通互联网域名更自由的主机名相关联。我想创建一个函数,以确定给定名称是否是有效的"主机"文件域名。

基于这个答案和实验的结果,我得出了以下函数:

private static bool IsValidDomainName(string domain)
{
    if (String.IsNullOrEmpty(domain) || domain.Length > 255)
    {
        return false;
    }

    Uri uri;

    if (!Uri.TryCreate("http://" + domain, UriKind.Absolute, out uri))
    {
        return false;
    }

    if (!String.Equals(uri.Host, domain, StringComparison.OrdinalIgnoreCase) || !uri.IsWellFormedOriginalString())
    {
        return false;
    }

    foreach (string part in uri.Host.Split('.'))
    {
        if (part.Length > 63)
        {
            return false;
        }
    }

    return true;
}

它的好处在于,它应该可以处理Unicode名称(基本正则表达式无法处理的情况)。是否有更好/更优雅的方法来做到这一点?更新:如Bill所建议的那样,Uri.CheckHostName方法几乎可以实现我想要的效果,但它不允许像Windows中的“hosts”文件中允许的“-test”这样的主机名。我会特别处理“-”部分,但我担心还有更多的特殊情况。
2个回答

47

你觉得 System.Uri.CheckHostName() 方法怎么样?

private static bool IsValidDomainName(string name)
{
    return Uri.CheckHostName(name) != UriHostNameType.Unknown;
}

为什么要自己做这项工作?


6
请注意,即使传入 null 或空字符串也会返回正确的答案。 - Bill
我以前没见过这个方法。在我的反编译中错过了它。它比我的“http”前缀黑客更好,但是hosts文件允许使用“-test”作为名称,但是这个函数却说它无效。 - Jeff Moser
“http”前缀的技巧可以正确允许“-test”案例,但只使用Uri.CheckHostName是不行的。 - Jeff Moser
1
我不知道hosts文件中允许的所有内容,例如“-test”。 - Bill
这不是一个有用的函数。实际上它接受几乎所有你键入的内容。所以afdasdfa同样是有效的。我已经以各种可能的方式进行了测试! - Dwza
1
@Dwza 虽然 afdasdfa 不是一个完全合格的域名,但它仍然像 localhost 主机名一样是一个有效的主机名 - Lightman

0

7
我不同意 - 这不是最好的方式,但它是最稳健的方式(因为现在你毫无疑问地知道该域是有效的)。然而...如果该域名没有注册或未托管在任何地方,或者您无法通过网络访问它,或者由于某种原因而关闭,那将导致无法在这些情况下验证有效的域名,至少会失败一次。 - Richard Barker
你应该查询whois以确保该域名已经注册。 - Yanga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接