(域名)子域名中是否有下划线“_”?

子域名(域名)是否有下划线_

这里给出的大多数答案都是假的 在域名中使用下划线是完全合法的。 让我引用标准RFC 2181第11节“名称语法” :

DNS本身只能对可用于识别资源logging的特定标签设置一个限制。 这一个限制与标签的长度和全名有关。 […] DNS协议的实现不能对可以使用的标签进行任何限制。 特别是,DNS服务器不能拒绝服务区域,因为它包含某些DNS客户端程序可能不能接受的标签。

另请参阅原始DNS规范RFC 1034第3.5节“首选名称语法”,但仔细阅读。

带下划线的域在野外非常普遍。 检查_jabber._tcp.gmail.com_sip._udp.apnic.net

这里提到的其他RFC处理不同的事情。 原来的问题是域名 。 如果问题是针对主机名 (或者包含主机名的URL),那么这是不同的,相关标准是RFC 1123第2.1节“主机名和数字”,它将主机名限制为字母数字连字符。

关于术语的说明,是为了推进Bortzmeier的回答

一个人应该清楚的定义。 这里使用的是:

  • 域名DNS数据库中资源标识
  • 标签点之间的域名的一部分
  • 主机名标识Internet主机特殊types的域名

主机名受RFC 952的限制以及RFC 1123的轻微放宽

RFC 2181明确指出,域名和主机名是有区别的:

… [任何二进制标签都可以具有MXlogging的事实并不意味着任何二进制名称都可以用作电子邮件地址的主机部分…

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

在实践中,人们可能会看到带下划线的主机名 。 正如鲁毅治原则所说:“要保守你所发的,放开你所接受的东西”。

关于编码的说明

在21世纪, 主机名域名可能会被国际化! 这意味着如果标签包含超出允许集的字符,则采用编码。

尤其是,它允许在主机名中编码_ (更新2017-07:这是值得怀疑的,请参阅注释, _仍然不能用于主机名,甚至不能用于国际化的标签。

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

  • RFC 5890 “IDNA:定义和文档框架”
  • RFC 5891 “IDNA:协议”
  • RFC 5892 “Unicode代码点和IDNA”
  • RFC 5893 “IDNA的从右到左脚本”
  • RFC 5894 “IDNA:背景,说明和理由”
  • RFC 5895 “为IDNA 2008映射字符”

您可能还想检查维基百科条目

RFC 5890引入了用于主机 名称的标签 LDH(字母 – 数字 – 超范围)标签 ,并说:

这是在主机名(RFC 952)中使用的经典标签forms,虽然有一些额外的限制。 其语法与由RFC 1123修改的RFC 1034第3.5节中的“首选名称语法”相同。简而言之,它是由ASCII字母,数字和连字符组成的string,连字符不能包含其他限制出现在string的开头或结尾。 像所有的DNS标签一样,它的总长度不能超过63个八位字节。

回到更简单的时代, 这个互联网草案是主机名国际化的早期提案。 具有国际字符的主机名可以使用例如“RACE”编码进行编码 。

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

根据RFC 1035,主机部分必须不区分大小写,以字母或数字开头和结尾,并且只包含字母,数字和连字符(“ – ”)。 这当然不包括任何国际化字符,以及ASCII字符集中的许多其他字符。 此外,域名部分的长度必须是63个八位字节或更短。所有包含国际化字符的转换后名称部分都以string“bq–”开头。 (…)selectstring“bq–”是因为在制定规范之前,主机部分中不太可能存在string。

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

所以要小心。 🙂

明确bortzmeyer和大卫Tonhofer ,域名和子域名标签可以包含领先的下划线,但没有其他地方。

正如David Tonhofer写的,标签是时间间隔的部分,应遵循LDH规则, 除非指定服务标签和端口标签来区分标签和普通标签。 然后,它们必须出现在标签的开始处,该标签应该是来自服务名称和端口号码registry的“简称”,不带前导0的端口号或者协议(即,tcp,udp)。 这些服务标签进一步限制为15个字符。

  • RFC2782指定带下划线的前缀服务logging子域。
  • RFC6698在TLSA证书logging中指定带有下划线的前缀端口号。

与David Tonhofer的回答相反,IDN不允许编码下划线('_'U + 005F LOW LINE)或任何其他无效的ASCII字符。

从RFC5890

[…]通过引入IDNA创build了两个新的LDH标签子集。 这些被称为保留LDH标签(R-LDH标签)和非保留LDH标签(NR-LDH标签)。 保留的LDH标签(在其他一些情况下称为“标签域名”)具有在第三个和第四个字符中包含“ – ” 但是符合LDH标签规则的属性。

Punycode将所有ASCII代码点直接编码为ASCII,包括下划线。 产生的R-LDH将不符合LDH标签规则。 例如, Σ_.com会被编码为违反规则的xn--_-zmb.com 。 可能有一个单独的代码点,看起来像一个下划线,可以合法编码(也许'_'U + FF3F全宽低线),但这些types的代码点将被分类为由RFC5892在2.3 IgnorableProperties中作为Noncharacter_Code_Point DISALLOWED。

RACE(另一种提议的IDN编码scheme)不被IETF接受为标准,不应该被使用。

我跟随了RFC1034的链接,并阅读了大部分内容,很惊讶地看到这一点:

标签必须遵循ARPANET主机名称的规则。 他们必须以字母开始,以字母或数字结尾,并且只有字母,数字和连字符作为内部字符。 长度也有一些限制。 标签必须不超过63个字符。

为了澄清,域名由以点分隔的标签组成。“ 这个规范必须过时,因为它没有提到下划线的使用。 如果有人在不知道已经过时的情况下摔倒了这个规范,我可以理解这种混乱。 它已经过时了,不是吗?

我跟随了RFC2181的链接并阅读了一些内容。 特别是涉及到什么是权威的,或者规范的名称以及什么是有效的DNS标签的问题。

如前所述,它表示只有一个长度限制,然后总结它写道:

(关于名字和有效的标签)

这些已经被充分说明,但是规格似乎有时被忽略。 我们试图加强现有的规范。

让我想知道“长度限制”是否“足够”。 我们是否会开始看到像@#$%这样的域名! 不久? 互联网不够用吗?