7

RFC 3986 指定 URI 的主机组件是“不区分大小写”的。但是,它没有指定 UCS 或 UTF-8 字符中“不区分大小写”的含义。

RFC 中给出的示例(例如“ <HTTP://www.EXAMPLE.com/> 等同于<http://www.example.com/>”)允许我们推断“不区分大小写”意味着字符 AZ 至少被认为等同于 UTF-8 字符集中它们前面的字符 32,即AZ 但是,没有提到应该如何处理超出此范围的字符。因此,鉴于www.OLÉ.com的非编码、非规范化注册名称,我看到 RFC 允许的三种潜在规范化形式:

  1. 小写到 www.olé.com然后百分比编码到 www.ol%E9.com
  2. 仅小写 AZ 字符到www.olÉ.com,然后百分比编码到 www.ol%C9.com
  3. 百分比编码为 www.OL%C9.com,然后将非百分比编码部分小写为 www.ol%C9.com,产生与 2 相同的结果。

所以问题是:哪个是正确的?如果是 case 1.,什么定义了哪些字符被认为是大写的,哪些被认为是小写的(哪些字符没有大小写)?

4

1 回答 1

3

DNS解析的主机名总是小写的。

DNS 主机名 (RFC 1123)中不可能有 UTF-8 字符,但是,已经使用“国际化域名”采取了解决方法。这种解决方法通常称为punycode

Punycode 使非 ASCII 字符可以用 ASCII 字符表示。

非 ASCII 字符由主机名标签(字母、数字和连字符)中允许的 ASCII 字符表示。

-- https://www.ietf.org/rfc/rfc3492.txt

至于您在问题( )中提供的示例,将解析www.olé.com域名不是www.ol%E9.com。

如果您的域名中有百分号,则表示您已对主机名进行了 URL 编码,这是不正确的,至少对于解析而言是不正确的。

例如,具有如下a所示的标签将正常工作:

<a href="//www.ol%C3%A9.com">Click Here</a>

但是,DNS 服务器不会解析www.ol%C3%A9.com,而是将转换后的域名解析为 punycode:

例子

www.ol%C3%A9.com

变成

www.olé.com

在 punycode 中转换为:

www.xn--ol-cja.com

Web 浏览器通常会将大写字符转换为小写版本。例如,两者www.olé.com和都www.olÉ.com转换为相同的 DNS 主机名 ( www.xn--ol-cja.com),因为www.olÉ.com被小写为www.olé.com.

我推荐两个工具来检查 IDN 域名,看看域名经过 punycode 翻译后的样子:

Verisign 的 IDN 工具要严格得多。尝试使用这两种工具www.olÉ.com作为输入,看看我的意思。

IDNA(应用程序的国际化域名)的规则很复杂,但有两个主要的 RFC 值得一看:

  • 国际化应用域名 (IDNA):背景、解释和基本原理
    https://www.rfc-editor.org/rfc/rfc5894
  • 应用程序的 Unicode 代码点和国际化域名
    https://www.rfc-editor.org/rfc/rfc5892

rfc5894 第 3.1.3 节指定在以下情况下可能不允许使用字符:

  • 字符是大写形式或通过 Unicode 大小写折叠映射到另一个字符的其他形式。
于 2015-10-30T03:05:39.157 回答