RFC 2181 早在 1997 年就放宽了 DNS 名称中可接受的字符。但人们似乎仍然对在主机名中使用下划线感到不安。(例如,GoDaddy 不会出售带有下划线的二级域名,如“this_bites.com”)
经过几分钟的测试,包含下划线的三级主机名在我办公室的所有设备上都可以正常工作。(例如,that_guy.example.com,我的 DNS 主机是 Amazon Route 53)
它在 Win XP 和 Win 7、Mac OSX 10.7、IE8 和 9、现代 Firefox、Safari 和 Chrome 上“运行”。
我能指望它在哪里不是工作?
(我为什么要关心?我正在为学生分配虚拟机,我想使用他们在主机名中选择的用户 ID 来提醒他们,他们在盒子上的操作直接归因于他们。不幸的是,很大一部分预先存在的学生用户 ID 包含下划线。)
答案1
需要明确的是,从一开始,下划线在 DNS 中就是被允许的。RFC 1034关于标签的语法有这样的说法:
3.5. 首选名称语法
DNS 规范试图在域名构造规则方面尽可能通用。其理念是,任何现有对象的名称都可以用域名来表示,而只需进行最小的更改。然而,在为对象分配域名时,谨慎的用户会选择一个既满足域系统规则又满足该对象的任何现有规则的名称,无论这些规则是已发布的还是现有程序所暗示的。
这意味着:如果你将主机名放入 DNS,请遵守主机名规则。如果你将邮件域放入 DNS,请遵守RFC 822如果你把密钥管理信息系统或者枚举DNS 中的记录(不是主机名)会限制您自己使用这些协议的语法。如果您输入其他内容,请遵循相应的语法。但 DNS 本身不会限制您。
RFC 1034 继续对指定不带下划线的标签的语法提出了保守建议。但这只是一个建议。它说“以下语法将导致更少的问题”。
因此,GoDaddy 拒绝您使用“this_bites.com”肯定是错误的。即使主机名中明确禁止使用下划线,您可能仍希望使用代表主机名以外的其他内容的 DNS 名称来填充此域。DNS 注册商和名称服务提供商不应禁止这样做!
下一个问题是,实际主机名中是否允许使用下划线?
RFC 1034 中关于主机名的说明是“应遵循 HOSTS.TXT 的旧规则”。但是,如果在编写 RFC 1034 时 HOSTS.TXT 的规则已经过时,那么现在它们已经成为历史了!编写 RFC 1034 时,用户名通常不能超过 8 个字符,并且所有内容都是 ASCII。世界已经改变。
我想说,没有一套单一的规则来定义什么是有效的主机名。它只取决于所使用的软件支持哪些字符,这些字符可能是系统用来指定自身和对等体的主机名的一部分。我所说的“软件”是指以某种方式处理主机名的所有软件,从操作系统到网络监控代理以及介于两者之间的一切。
如果您有理由确信您的环境中没有任何东西会因包含下划线的主机名而阻塞(并且我认为,现在,这是一个非常好的假设),那么我认为您可以安全地使用它们。
如果有是有些东西会阻止您在主机名中使用下划线,但它不是 DNS,而且从来都不是。
答案2
Android 和 Java 似乎对域中的下划线存在问题。特别是 Java 中的 URI 类将无法正确解析 URI,并会抛出 UnknownHostExceptions。