子域(域名)可以有下划线_吗?


当前回答

个人顶级域名可以在他们认为合适的情况下对域名设置自己的规则和限制,例如适应当地语言。

例如,根据CIRA,加拿大的。ca域名被允许:

字母a ~ z,以及以下重音字符:é ë ê è â à æ ô ù û ü ç î ï。请注意,域名不区分大小写。这意味着大写字母和小写字母之间没有区别(A = A); 数字0123456789和 连字符("-)(虽然不能用于域名的开头或结尾)。

最大长度为63个字符,每个重音字符减少4个字符的限制。

(源)


顺便说一句,这为。ca域提供了大约4个四次方的域名可能性(不包括子域名)。

其他回答

关于术语的注释,有助于Bortzmeyer的回答

人们应该清楚定义。在这里使用:

域名是DNS数据库中资源的标识符 标签是域名中点与点之间的部分 主机名是一种特殊类型的域名,用于标识Internet主机

主机名受RFC 952和RFC 1123的限制

RFC 2181明确了域名和主机名之间的区别:

...任何二进制标签都可以有MX记录这一事实并不意味着任何二进制名称都可以用作电子邮件地址的主机部分……

所以主机名中的下划线是不可以的,域名中的下划线是可以的。

在实践中,很可能会看到带有下划线的主机名。正如稳健性原则(robust Principle)所言:“送出的东西要保守,接受的东西要自由。”

关于编码的说明

在21世纪,事实证明,主机名和域名都可能国际化!这意味着在标签包含允许集合之外的字符的情况下求助于编码。

特别是,它允许在主机名中编码_(更新2017-07:这是可疑的,见评论。“_”仍然不能用于主机名。事实上,它甚至不能用于国际化的标签。)

第一个国际化的RFC是2003年3月的RFC 3490,“国际化应用程序中的域名(IDNA)”。今天,我们有:

RFC 5890“IDNA:定义和文档框架” RFC 5891“IDNA:协议” RFC 5892“统一码位和IDNA” RFC 5893“IDNA的从右向左脚本” RFC 5894《IDNA:背景、解释和基本原理》 RFC 5895“IDNA 2008的映射字符”

你可能还想查看维基百科词条

RFC 5890为主机名中使用的标签引入了术语LDH(字母-数字-连字符)标签,并表示:

这是在主机名中使用的经典标签形式,尽管有一些额外的限制(RFC 952)。它的语法与RFC 1123修改的RFC 1034章节3.5中描述的“首选名称语法”相同。简单地说,它是一个由ASCII字母、数字和连字符组成的字符串,进一步的限制是连字符不能出现在字符串的开头或结尾。与所有DNS标签一样,它的总长度不能超过63个字节。

回到更简单的时代,这个Internet草案是主机名国际化的早期建议。带有国际字符的主机名可以使用,例如,'RACE'编码进行编码。

“RACE编码”提案的作者指出:

According to RFC 1035, host parts must be case-insensitive, start and end with a letter or digit, and contain only letters, digits, and the hyphen character ("-"). This, of course, excludes any internationalized characters, as well as many other characters in the ASCII character repertoire. Further, domain name parts must be 63 octets or shorter in length.... All post-converted name parts that contain internationalized characters begin with the string "bq--". (...) The string "bq--" was chosen because it is extremely unlikely to exist in host parts before this specification was produced.

还有一件事你可能需要知道:如果url的主机或子域部分包含下划线,IE9(尚未测试其他版本)不能编写cookie。

所以要小心。: -)

以下是我在Java世界的2点看法:

在Spark Scala控制台,使用Java 8:

scala> new java.net.URI("spark://spark_master").getHost
res10: String = null

scala> new java.net.URI("spark://spark-master").getHost
res11: String = spark-master

scala> new java.net.URI("spark://spark_master.google.fr").getHost
res12: String = null

scala> new java.net.URI("spark://spark.master.google.fr").getHost
res13: String = spark.master.google.fr

scala> new java.net.URI("spark://spark-master.google.fr:3434").getHost
res14: String = spark-master.google.fr

scala> new java.net.URI("spark://spark-master.goo_gle.fr:3434").getHost
res15: String = null

这绝对是个坏主意^^

我参考了RFC1034的链接,阅读了大部分内容,并惊讶地看到了这个:

标签必须遵循ARPANET主机名规则。他们必须 以字母开头,以字母或数字结尾,内部相同 只能使用字母、数字和连字符。还有一些 长度限制。标签必须小于等于63个字符。

为了说明,域名由标签组成,标签之间用点“。”隔开。这个规范肯定过时了,因为它没有提到下划线的使用。如果有人在不知道这个规范已经过时的情况下偶然发现它,我可以理解这种困惑。它已经过时了,不是吗?

我参考了RFC2181的链接并阅读了其中的一些内容。特别是当它涉及到什么是权威或规范名称的问题,以及什么是有效的DNS标签的问题时。

正如之前发布的那样,它只限制了长度,然后总结起来是这样的:

(关于名称和有效标签)

这些已经被充分地指定了,但是这些规范有时似乎被忽略了。我们寻求加强现有的规范。

有点让我怀疑“只限制长度”是否“足够”。我们会开始看到像@#$%这样的域名吗!!很快吗?难道互联网还不够糟糕吗?

刚刚创建了本地项目(与流浪者),它在通过ip地址访问时工作得很好。然后我添加了some_name。test to hosts文件,并尝试以这种方式访问它,但我一直得到“坏请求- 400”。浪费了好几个小时,直到我发现把域名改成某个名字。测试解决了问题。所以至少在Mac OS上是不行的。