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

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

182699 次浏览

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

DNS本身对特定的标签只有一个限制 可用于标识资源记录。那一个 限制涉及到标签的长度和完整 的名字。[…DNS协议的实现不能放置任何 对可使用标签的限制。特别是DNS 服务器不能因为一个区域包含标签而拒绝提供服务 这对于某些DNS客户端程序来说可能是不可接受的

参见原始DNS规范,RFC 1034,第3.5节 首选名称语法;

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

这里提到的其他RFC处理不同的事情。最初的 问题是域名。如果问题是主机 names(或对于包含主机名的url),则为 不同的,相关的标准是RFC 1123,第2.1节"主机 姓名和号码;它限制主机名为 letters-digits-hyphen . < / p >

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

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

.标签长度小于等于63个字符

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

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

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

(关于名称和有效标签)

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

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

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

所以要小心。: -)

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

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

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

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

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

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

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

在实践中,很可能会看到带有下划线的主机名。正如健壮性原则所说:“在你发送的东西上要保守,在你接受的东西上要自由”。

关于编码的说明

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

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

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

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

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

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

回到更简单的时代,这个网络草案主机名国际化的早期提议。带有国际字符的主机名可以使用,例如,“种族”编码进行编码。

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

根据RFC 1035,主机部件必须不区分大小写,以字母或数字开头和结尾,只能包含字母、数字和连字符("-")。当然,这排除了任何国际化字符,以及ASCII字符库中的许多其他字符。此外,域名部分必须是63字节或更短 长度……所有包含国际化字符的后转换名称部分都以字符串“&;bq—&;”开头。(…)字符串"bq——"被选中是因为它极不可能

.在此规格之前存在于主机部件中

明确bortzmeyer大卫Tonhofer,域名和子域名标签可以包含前导下划线,但在其他地方不能包含下划线。

正如大卫Tonhofer所写的,标签是在句点之间的部分,在指定服务标签和端口标签时应该遵循LDH规则除了,以将它们与常规标签区分开来。然后,它们必须出现在标签的开头,应该是“短名称”;从服务名称和端口号注册中心,没有前导0的端口号,或协议(即。tcp, udp)。这些服务标签进一步限制为15个字符。

  • RFC2782指定前缀
  • .服务记录子域
  • RFC6698指定前缀
  • . TLSA证书记录中下划线端口号

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

RFC5890

< p > [. .]两个新的LDH标签子集由 介绍IDNA。这些被称为保留LDH标签(R-LDH 非保留LDH标签(NR-LDH标签)。保留LDH 标签,即“带标签的域名”;在其他一些语境中,have 它们所包含的属性“;——”;在第三和第四 字符但在其他方面符合LDH标签规则。< / p >

Punycode将所有ASCII码点直接编码为ASCII,包括下划线。生成的R-LDH不符合LDH标签规则。例如,Σ_.com将被编码为违反规则的xn--_-zmb.com。可能会有一个单应码点,看起来像一个下划线,可以合法编码(可能是'_' U+FF3F fullwidth low line),但这些类型的码点将被2.3 IgnorableProperties下的RFC5892归类为DISALLOWED作为Noncharacter_Code_Point。

RACE(另一个提议的IDN编码方案)没有被IETF接受为标准,不应该被使用。

以下是我在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

这绝对是个坏主意^^

个人TLD可以放置自己的规则&域的名称的限制,如适应当地语言。

例如,根据CIRA,加拿大的< a href = " http://cira。ca" rel="nofollow noreferrer">.ca . ca" rel="nofollow noreferrer域名是允许的:

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

  • 数字0123456789

  • 连字符("-)(虽然它不能用于域名的开始或结束)。

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

()


顺便说一下,这允许大约4 Quadragintillion域名可能性(不包括子域)。ca域。

最近cab论坛(*)决定

在任何dNSName条目中包含下划线字符且有效期超过30天的所有证书必须在2019年1月15日之前撤销。https://cabforum.org/2018/11/12/ballot-sc-12-sunset-of-underscores-in-dnsnames/

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

(*)证书颁发机构浏览器论坛(CA/浏览器论坛)是主要证书颁发者(定义见下文2.1(a)(1)和(2)节)和互联网浏览器软件和其他使用证书的应用程序供应商(定义见下文2.1(a)(3)节)的自愿聚会。

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

不,你不能在子域中使用下划线,只能在连字符(破折号)中使用。例如,my-subdomain.agahost.com是可以接受的,my_subdomain.agahost.com是不可以接受的。

不管主机名和域名的讨论如何,在url的主机部分使用下划线肯定是一个非常糟糕的主意。它会给你带来悲伤。它可能在浏览器中很好地工作,但在最近的一个案例中,我遇到了一个应用程序拒绝使用*.s3的完全有效的通配符证书建立tls连接。Amazonaws.com,因为通配符主机名部分有一个下划线,并且不生效。我相信底层库使用了openssl。

截至2022年,谷歌搜索中出现了子域名包含下划线的网站。