为何RFC 3986声明URI的host组件大小写不敏感但语法规则允许大写?
URI Host组件大小写规则与健壮性原则的关联
先结合RFC 3986第3节(语法组件)和第3.2节(权限部分)的图示,回顾URI的组件结构:
以下是两个URI示例及其组件拆分: userinfo host port | | | ____|______ ___|_____ _| / \ / \ / \ foo://user:password@example.com:8042/over/there?name=ferret#nose \_/ \____________________________/\_________/ \_________/ \__/ | | | | | scheme authority *----------- path query fragment | | | _____________________|__ / \ / \ urn:example:animal:ferret:nose
RFC 3986第3.2.2节多次明确指出“host”部分是大小写不敏感的:
Host子组件是大小写不敏感的。[...] 尽管Host不区分大小写,但URI生成器和标准化工具应该统一使用小写的注册名称和十六进制格式的地址,仅在百分编码场景下使用大写字母。
但对应的语法规则也允许使用大写字母:
host = IP-literal / IPv4address / reg-name reg-name = *( unreserved / pct-encoded / sub-delims ) unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"(参见RFC 3986第2.3节:未保留字符)
这种设计的原因是否与健壮性原则相关?URI的“scheme”组件(RFC 3986第3.1节)也存在类似的规则设定,但明确给出了设计理由:
尽管Scheme不区分大小写,但它的规范形式是小写,定义Scheme的文档必须使用小写字母。实现方为了保证健壮性,应该接受大写字母作为小写的等价形式(例如同时允许"HTTP"和"http"),但为了一致性,只应生成小写的Scheme名称。
scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
RFC 3986第3.2.2节未明确说明Host部分采用这种设计的理由,是否意味着这是隐含遵循健壮性原则?
内容的提问来源于stack exchange,提问作者toraritte
相关产品推荐
相关产品推荐

