子域名(域名)可以在其中加下 _ 吗?
_
人们应该清楚定义 . 如下所用:
domain name 是DNS数据库中资源的标识符
label 是点之间的域名的一部分
hostname 是一种特殊类型的域名,用于标识Internet主机
主机名受RFC 952和slight relaxation of RFC 1123的限制
RFC 2181明确表示域名和主机名之间存在差异:
... [事实]任何二进制标签都可以有MX记录并不意味着任何二进制名称都可以用作电子邮件地址的主机部分......
所以主机名中的下划线是禁止的,域名中的下划线是不行的 .
在实践中,人们可能会看到带有下划线的主机名 . 正如Robustness Principle所说:"Be conservative in what you send, liberal in what you accept" .
在21世纪,事实证明主机名和域名可能会国际化!这意味着如果标签包含超出允许集的字符,则需要编码 .
特别是,它允许人们在主机名中编码 _ (更新2017-07:这是值得怀疑的,请参阅注释. _ 仍然不能在主机名中使用 . 实际上,它甚至不能用于国际化标签 . )
国际化的第一个RFC是2003年3月RFC 3490,"Internationalizing Domain Names in Applications (IDNA)" . 今天,我们有:
RFC 5890 "IDNA: Definitions and Document Framework"
RFC 5891 "IDNA: Protocol"
RFC 5892 "The Unicode Code Points and IDNA"
RFC 5893 "Right-to-Left Scripts for IDNA"
RFC 5894 "IDNA: Background, Explanation, and Rationale"
RFC 5895 "Mapping Characters for IDNA 2008"
您可能还想查看Wikipedia Entry
RFC 5890为主机名中使用的标签引入了术语LDH (Letter-Digit-Hypen) label,并说:
这是在主机名(RFC 952)中使用的经典标签形式,虽然有一些额外的限制 . 它的语法与RFC 1123修改后的RFC 1034第3.5节中的“首选名称语法”相同 . 简而言之,它是由ASCII字母,数字和连字符组成的字符串,并且连字符不能进一步限制出现在字符串的开头或结尾 . 与所有DNS标签一样,其总长度不得超过63个八位字节 .
回到更简单的时间,this Internet draft是主机名国际化的早期提案 . 具有国际字符的主机名可以使用例如'RACE' encoding进行编码 .
“RACE编码”提案的作者指出:
根据RFC 1035,主机部分必须不区分大小写,以字母或数字开头和结尾,并且只包含字母,数字和连字符(“ - ”) . 当然,这不包括任何国际化字符,以及ASCII字符集中的许多其他字符 . 此外,域名部分的长度必须为63个八位字节或更短 . 所有包含国际化字符的转换后的名称部分都以字符串“bq--”开头 . (...)选择字符串“bq--”是因为在生成此规范之前,它不太可能存在于主机部件中 .
还有一件事您可能需要知道:如果url的主机或子域部分包含下划线,IE9(尚未测试其他版本)无法写入cookie .
所以要小心 . :-)
这里给出的大多数答案都是 false . 在域名中使用下划线是完全合法的 . 让我引用标准,RFC 2181, section 11, "Name syntax":
DNS本身仅对可用于标识资源记录的特定标签设置一个限制 . 该限制涉及标签的长度和全名 . [...] DNS协议的实现不得对可以使用的标签施加任何限制 . 特别是,DNS服务器不得拒绝为区域提供服务,因为它包含某些DNS客户端程序可能无法接受的标签 .
另请参阅原始DNS规范RFC 1034,第3.5节"Preferred name syntax",但请仔细阅读 .
具有下划线的域在野外非常常见 . 检查 _jabber._tcp.gmail.com 或 _sip._udp.apnic.net .
_jabber._tcp.gmail.com
_sip._udp.apnic.net
这里提到的其他RFC处理不同的事情 . 最初的问题是 domain names . 如果问题是针对 host names (或针对包含主机名的URL),那么这是不同的,相关标准是RFC 1123,第2.1节"Host Names and Numbers"将 host names 限制为字母 - 数字 - 连字符 .
澄清bortzmeyer和David Tonhofer,域名和子域名称标签可以包含前导下划线,但不包含其他地方 .
正如David Tonhofer所写,标签是句点之间的部分,应该遵循LDH规则,除非指定服务标签和端口标签以区别于常规标签 . 然后它们必须出现在标签的开头,该标签应该是Service Name and Port Number Registry的"Short Names",没有前导0的端口号,或协议(即tcp,udp) . 这些服务标签进一步限制为15个字符 .
RFC2782指定带有下划线的服务记录子域前缀 .
RFC6698指定在TLSA证书记录中使用下划线添加前缀端口号 .
与David Tonhofer 's answer, IDN does not allows for encoding underscore (' _'U 005F LOW LINE)或任何其他无效的ASCII字符相反 .
从RFC5890
[..]通过引入IDNA创建了两个新的LDH标签子集 . 这些被称为保留LDH标签(R-LDH标签)和非保留LDH标签(NR-LDH标签) . 保留的LDH标签(在某些其他上下文中称为“标记域名”)具有在第三和第四个字符中包含“ - ”但在其他方面符合LDH标签规则的属性 .
Punycode直接将所有ASCII码点编码为ASCII,包括下划线 . 产生的R-LDH不符合LDH标签规则 . 例如, Σ_.com 将被编码为违反规则的 xn--_-zmb.com . 可能存在一个看似下划线的单应码码,它可以合法编码(也许是_ FF16F全宽低线),但这些类型的码点在2.3 IgnorableProperties下被分类为RFC5892作为Noncharacter_Code_Point .
Σ_.com
xn--_-zmb.com
RACE(另一个提议的IDN编码方案)不被IETF接受为标准,不应使用 .
我按照RFC1034的链接阅读了大部分内容,并惊讶地发现:
标签必须遵循ARPANET主机名的规则 . 它们必须以字母开头,以字母或数字结尾,并且内部字符仅包含字母,数字和连字符 . 长度也有一些限制 . 标签不得超过63个字符 .
为了澄清,域名由标记组成,这些标签用点“ . ”分隔 . 此规范必须过时,因为它没有提到使用下划线 . 如果有人在不知道它已经过时的情况下绊倒了这个规范,我就能理解这种混乱 . 它已经过时了,不是吗?
我按照RFC2181的链接阅读了一些内容 . 特别是涉及权威或规范名称的问题以及制作有效DNS标签的问题 .
如前所述,它表示只有一个长度限制,然后总结它读取:
(关于名称和有效标签)
这些已经充分说明,但规格似乎有时会被忽略 . 我们寻求加强现有规范 .
让我想知道“只有长度限制”是否“足够” . 我们是否会开始看到像@#$%这样的域名!不久?互联网搞砸了不够?
这里来自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
这绝对是一个坏主意^^
如果您希望它在Internet上解析,则不是 .
你不能:http://my_subdomain.example.com无效 .
您可以:http://my-subdomain.example.com带连字符 .
个人TLD可以根据自己的意愿对domains names进行自己的规则和限制,例如以适应当地语言 .
例如,根据CIRA,允许加拿大的 .ca 域名:
字母a到z,以及以下重音字符:éëêèàæôœùùüçîïÿ . 请注意,域名不区分大小写 . 这意味着大写字母和小写字母之间没有区别(A = a);数字0123456789和连字符(“ - ”(尽管它不能用于开始或结束域名) .
最大长度为63个字符,除了每个重音字符减少 4 个字符的限制 .
(Source)
顺便提一下,这允许dot-ca域的大约4个Quadragintillion域名可能性(不计算子域) .
8 回答
关于术语的说明,以促进Bortzmeyer的回答
人们应该清楚定义 . 如下所用:
domain name 是DNS数据库中资源的标识符
label 是点之间的域名的一部分
hostname 是一种特殊类型的域名,用于标识Internet主机
主机名受RFC 952和slight relaxation of RFC 1123的限制
RFC 2181明确表示域名和主机名之间存在差异:
所以主机名中的下划线是禁止的,域名中的下划线是不行的 .
在实践中,人们可能会看到带有下划线的主机名 . 正如Robustness Principle所说:"Be conservative in what you send, liberal in what you accept" .
关于编码的说明
在21世纪,事实证明主机名和域名可能会国际化!这意味着如果标签包含超出允许集的字符,则需要编码 .
特别是,它允许人们在主机名中编码
_
(更新2017-07:这是值得怀疑的,请参阅注释._
仍然不能在主机名中使用 . 实际上,它甚至不能用于国际化标签 . )国际化的第一个RFC是2003年3月RFC 3490,"Internationalizing Domain Names in Applications (IDNA)" . 今天,我们有:
RFC 5890 "IDNA: Definitions and Document Framework"
RFC 5891 "IDNA: Protocol"
RFC 5892 "The Unicode Code Points and IDNA"
RFC 5893 "Right-to-Left Scripts for IDNA"
RFC 5894 "IDNA: Background, Explanation, and Rationale"
RFC 5895 "Mapping Characters for IDNA 2008"
您可能还想查看Wikipedia Entry
RFC 5890为主机名中使用的标签引入了术语LDH (Letter-Digit-Hypen) label,并说:
回到更简单的时间,this Internet draft是主机名国际化的早期提案 . 具有国际字符的主机名可以使用例如'RACE' encoding进行编码 .
“RACE编码”提案的作者指出:
还有一件事您可能需要知道:如果url的主机或子域部分包含下划线,IE9(尚未测试其他版本)无法写入cookie .
所以要小心 . :-)
这里给出的大多数答案都是 false . 在域名中使用下划线是完全合法的 . 让我引用标准,RFC 2181, section 11, "Name syntax":
另请参阅原始DNS规范RFC 1034,第3.5节"Preferred name syntax",但请仔细阅读 .
具有下划线的域在野外非常常见 . 检查
_jabber._tcp.gmail.com
或_sip._udp.apnic.net
.这里提到的其他RFC处理不同的事情 . 最初的问题是 domain names . 如果问题是针对 host names (或针对包含主机名的URL),那么这是不同的,相关标准是RFC 1123,第2.1节"Host Names and Numbers"将 host names 限制为字母 - 数字 - 连字符 .
澄清bortzmeyer和David Tonhofer,域名和子域名称标签可以包含前导下划线,但不包含其他地方 .
正如David Tonhofer所写,标签是句点之间的部分,应该遵循LDH规则,除非指定服务标签和端口标签以区别于常规标签 . 然后它们必须出现在标签的开头,该标签应该是Service Name and Port Number Registry的"Short Names",没有前导0的端口号,或协议(即tcp,udp) . 这些服务标签进一步限制为15个字符 .
RFC2782指定带有下划线的服务记录子域前缀 .
RFC6698指定在TLSA证书记录中使用下划线添加前缀端口号 .
与David Tonhofer 's answer, IDN does not allows for encoding underscore (' _'U 005F LOW LINE)或任何其他无效的ASCII字符相反 .
从RFC5890
Punycode直接将所有ASCII码点编码为ASCII,包括下划线 . 产生的R-LDH不符合LDH标签规则 . 例如,
Σ_.com
将被编码为违反规则的xn--_-zmb.com
. 可能存在一个看似下划线的单应码码,它可以合法编码(也许是_ FF16F全宽低线),但这些类型的码点在2.3 IgnorableProperties下被分类为RFC5892作为Noncharacter_Code_Point .RACE(另一个提议的IDN编码方案)不被IETF接受为标准,不应使用 .
我按照RFC1034的链接阅读了大部分内容,并惊讶地发现:
标签必须遵循ARPANET主机名的规则 . 它们必须以字母开头,以字母或数字结尾,并且内部字符仅包含字母,数字和连字符 . 长度也有一些限制 . 标签不得超过63个字符 .
为了澄清,域名由标记组成,这些标签用点“ . ”分隔 . 此规范必须过时,因为它没有提到使用下划线 . 如果有人在不知道它已经过时的情况下绊倒了这个规范,我就能理解这种混乱 . 它已经过时了,不是吗?
我按照RFC2181的链接阅读了一些内容 . 特别是涉及权威或规范名称的问题以及制作有效DNS标签的问题 .
如前所述,它表示只有一个长度限制,然后总结它读取:
(关于名称和有效标签)
这些已经充分说明,但规格似乎有时会被忽略 . 我们寻求加强现有规范 .
让我想知道“只有长度限制”是否“足够” . 我们是否会开始看到像@#$%这样的域名!不久?互联网搞砸了不够?
这里来自Java世界的2美分:
从Spark Scala控制台,使用Java 8:
这绝对是一个坏主意^^
如果您希望它在Internet上解析,则不是 .
你不能:http://my_subdomain.example.com无效 .
您可以:http://my-subdomain.example.com带连字符 .
个人TLD可以根据自己的意愿对domains names进行自己的规则和限制,例如以适应当地语言 .
例如,根据CIRA,允许加拿大的 .ca 域名:
最大长度为63个字符,除了每个重音字符减少 4 个字符的限制 .
(Source)
顺便提一下,这允许dot-ca域的大约4个Quadragintillion域名可能性(不计算子域) .