首先,提醒未来的自己(图RFC 3986,第 3 节。语法组件补充有第 3.2 节。权威):
The following are two example URIs and their component parts:
userinfo host port
| | |
____|______ ___|_____ _|
/ \ / \ / \
foo://user:[email protected]:8042/over/there?name=ferret#nose
\_/ \____________________________/\_________/ \_________/ \__/
| | | | |
scheme authority *----------- path query fragment
| |
| _____________________|__
/ \ / \
urn:example:animal:ferret:nose
第 3.2.2 节。 Host多次明确表示“主机”部分是不区分大小写,
主机子组件不区分大小写。 [..] 虽然主机不区分大小写,但为了统一起见,生产者和标准化者应使用小写字母表示注册名称和十六进制地址,而仅使用大写字母表示百分比编码。
但语法规则也允许使用大写字母:
host = IP-literal / IPv4address / reg-name reg-name = *( unreserved / pct-encoded / sub-delims ) unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
这背后的推理与稳健性原则有关吗? “方案”URI 组件(第 3.1 节。方案)似乎被定义为具有相同的模糊性,但它确实证明了它的合理性:
虽然方案不区分大小写,但规范形式是小写的,并且指定方案的文档必须使用小写字母。 实现应接受方案名称中的大写字母与小写字母相同(例如,允许“HTTP”和“http”)为了稳健性,但应仅生成小写方案名称以保持一致性。
scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
第 3.2.2 节。主持人没有明确说明这个理由,所以我认为这是隐含的?
正如 Moshi 指出的,我混淆了“区分大小写”和“字母大小写”的概念:
“方案”组件和“主机”权限子组件都是“不区分大小写”的,这意味着它们可以包含任何大小写的字母,但实现应分别将“方案”和“主机”值视为相同,如果仅所包含字母的大小写不同。 (请参阅第 1.3 节语法符号中
ALPHA
的定义。)