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


Answers:


362

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

DNS本身仅对可用于标识资源记录的特定标签施加了一个限制。这一限制与标签的长度和全名有关。[...] DNS协议的实现不得对可使用的标签施加任何限制。特别是,DNS服务器不得拒绝为区域提供服务,因为该区域包含某些DNS客户端程序可能不接受的标签。

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

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

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


73
为“域名”和“主机名”之间的差异+1
Alnitak

3
问题(除非进行了编辑)是关于子域的。主机名。您对事实陈述没有错,只是根据问题的措词指出答案是错误的。
redreinard 2014年

4
我很困惑,1034说:“标签必须遵循ARPANET主机名的规则。标签必须以字母开头,以字母或数字结尾,并且只能包含字母,数字和连字符作为内部字符。” 哪一部分可以加下划线?
claudekennilol

2
措辞令人困惑。网址不能包含下划线。URL始终是FQDN,不是主机名。FQDN可以具有一个空的主机名,在这种情况下,FQDN =域。_jabber._tcp.gmail.com不是域,而是FQDN。由于网址中不能包含下划线,因此您可能永远无法购买带下划线的域名。因此,从DNS语法的角度来看,即使是域也可能带有下划线,除非是本地域,否则您将永远不会遇到任何下划线。
胶囊

1
我看不到rfc1123的2.1版中的引号,该引号提及允许使用连字符。我在rfc952中看到名称可以是<let-or-digit-or-hyphen>。那是你指的吗?
AJP

93

关于术语的注释,以进一步支持Bortzmeyer的回答

应该清楚定义。如此处所用:

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

主机受到的限制RFC 952RFC 1123的轻微放松

RFC 2181明确指出,域名和主机名之间存在区别:

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

因此,主机名中的下划线是禁止的,域名中的下划线是可以的。

在实践中,很可能会看到带下划线的主机名。正如健壮性原则所说:“对您的发送内容要保守,对您的接受要宽松”。

编码注意事项

事实证明,在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的映射字符”

您可能还需要检查Wikipedia条目

RFC 5890还引入了术语LDH(字母,数字,连字符)标签标签中使用主机名,并说:

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

回到更简单的时代,此Internet草案主机名国际化的早期建议。具有国际字符的主机名可以使用“ RACE”编码进行编码

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

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


附带说明,“域键和服务记录之类的系统使用下划线来确保其特殊字符不会与主机名混淆。例如,_http._sctp.www.example.com为SCTP指定了服务指针域example.com中具有功能的网络服务器主机(www)。” (链接
x-yuri 2015年

忽略RACE编码部分,IDN已经使用'xn--'前缀将可转换字符转换为ASCII。
mootmoot

2
@ Nelda.techspiress它已经根据一些时间,但RFC 1034:域名-概念和工具,所谓的域的“子域” bar.baz.(举例)是分层下方域名只是收集bar.baz.,例如a.bar.baz.f.g.bar.baz.h.bar.baz.等等。此“子域”可能包含也可能不包含实际的主机名
David Tonhofer

2
在日常使用中,可能会错误地将字符串a.bar.baz(域名)称为字符串bar.baz(另一域名)的子域。域名(DNS数据库资源),a.bar.baz并且bar.baz可以是主机名,也可以不是。
David Tonhofer

1
RFC 1034的第8页上,我们读到:域由域名标识,并且由域名空间中位于或低于指定域的域名的那部分组成。一个域是另一个域的子域(如果该域包含在该域中)。可以通过查看子域的名称是否以包含域的名称结尾来测试这种关系。例如,ABCD是BCD,CD,D和“”的子域。
David Tonhofer

47

您可能还需要了解一件事:如果URL的主机或子域部分包含下划线,则IE9(尚未测试其他版本)无法编写cookie。

所以要小心。:-)



3
我们只是在一个项目中遇到了这个问题-我将为那里奇怪的IE问题而发疯。直到我们在子域中找到下划线。; o)
Kai Mattern 2012年

3
仍然是IE10中的问题。MS知道吗?
Piotr Kula 2014年

15
更相关:MS是否在乎这一点?
2014年


11

澄清bortzmeyerDavid Tonhofer,域名和子域名标签可以包含下划线,但是没有其他地方。

正如David Tonhofer所写,标签是中间的部分,应遵循LDH规则,除非指定服务标签和端口标签以区别于常规标签。然后它们必须出现在标签的开头,该标签应该是服务名称和端口号注册表中的“短名称” ,不带前导0的端口号或协议(即tcp,udp)。这些服务标签进一步限制为15个字符。

  • RFC2782用下划线指定服务记录子域的前缀。
  • RFC6698在TLSA证书记录中使用下划线指定端口号前缀。

David Tonhofer的答案相反,IDN不允许编码下划线('_'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违反规则。可能存在一个单字形式的代码点,看起来像一个下划线,可以合法地进行编码(也许是“ _” U + FF3F全角下划线),但是RFC5892在2.3 IgnorableProperties下将这些类型的代码点归类为DISALLOWED,作为Noncharacter_Code_Point。

IETF不接受RACE(其他提议的IDN编码方案)作为标准,因此不应使用。


1
最后。不敢相信这是整个页面中唯一谈论punycode的帖子。
佩里耶

6

我遵循了指向RFC1034的链接并阅读了其中的大部分内容,并惊讶地看到了这一点:

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

为了清楚起见,域名由以点“。”分隔的标签组成。该规范必须已过时,因为它没有提到下划线的使用。如果有人在不知情的情况下偶然发现了此规范,我可以理解它的困惑。它已经过时了,不是吗?

我按了RFC2181的链接并阅读了其中的一些内容。特别是在涉及什么是权威或规范名称的问题以及什么内容构成有效的DNS标签的问题时。

如前所述,它声明只有一个长度限制,然后将其总结为:

(关于名称和有效标签)

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

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


3
不,它不是过时的。RFC1034是有关主机名域名的一种特殊情况)的规范,主机名是DNS数据库中资源的通用标识符。例如,URI的“主机”部分的定义相当宽松tools.ietf.org/html/rfc3986#section-3.2.2),但是RFC警告:“由注册名称标识的主机通常是字符序列打算在本地定义的主机或服务名称注册表中查找的域名……要在DNS中查找的注册名称使用[RFC1034]第3.5节和[RFC1123]第2.1节定义的语法。”
David Tonhofer 2013年

3

最近,CAB论坛(*)决定:

含有任何DNSNAME条目下划线字符和具有超过30天的有效期中的所有证书必须被撤销之前2019年1月15日,https://cabforum.org/2018/11/12/ballot-sc-12- dnsnames下划线下划线/

这意味着您将不再被允许在具有ssl / tls证书的域中使用下划线。

(*)证书颁发机构浏览器论坛(CA /浏览器论坛)是领先的证书颁发者(定义见下文第2.1(a)(1)和(2)节)以及Internet浏览器软件和其他应用程序的供应商的自愿聚集使用证书(证书消费者,如以下第2.1(a)(3)节所定义)。


1

个人TLD的可以将自己的规则和限制在域的名字,因为他们认为合适的,例如,以适应当地的语言。

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

  • 信件a通过z,并以下重音符号:é ë ê è â à æ ô œ ù û ü ç î ï ÿ。请注意,域名不区分大小写。这意味着大写字母和小写字母(A= a)之间没有区别;

  • 数字0123456789

  • 连字符(“ -)(尽管不能用于开头或结尾域名)。

最大长度为63个字符,但每个带重音符号的字符最多可减少4个字符。

来源


顺便说一句,这为dot-ca域提供了大约4个Quadragintillion域名可能性(不计算子域)。


0

这是我来自Java世界的2美分:

从带有Java 8的Spark Scala控制台:

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

绝对是个坏主意^^


0

刚刚创建了一个本地项目(带有无业游民),并且通过ip地址访问时,它运行良好。然后,我在主机文件中添加了some_name.test并尝试以这种方式访问​​它,但是我一直都收到“错误请求-400”。浪费了数小时,直到我发现只需将域名更改为some-name.test即可解决问题。因此,至少在Mac OS上本地不起作用。



-2

如果您希望它在Internet上解决,则不会。

您不能拥有:http : //my_subdomain.example.com无效。

您可以使用:http : //my-subdomain.example.com(带连字符)。


现在是2019年1月15日之后-您的计数器示例不起作用。
乔因瓦普

@JoeInwap能否请您指出我的评论来源?
ankshah

我要经过cabforum.org/2018/11/12/…和o_o.lgms.nl提出的证书对该主机名无效的事实。但是,该名称确实可以解析。
乔因瓦普
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.