当您在浏览器中输入示例 URI 或单击它们作为 Web 文档中的链接时,浏览器必须将 URI(以字符串形式给出)解释为 URL 以定位资源。正是在这个从输入字符串(表示有效 URI)到有效 URL 的解释/翻译步骤中,一个被更改为另一个。为了检查给定字符串是否确实包含有效的 URL,该字符串由状态机解释并转换为 URL 的内存表示。此状态机处理两个示例的 URI 表示的差异,但导致 URL 的内存中表示相同。也就是说,没有权限的情况和空权限的情况之间的内存表示中没有表示差异。下一个,URL 的内存表示被序列化回一个字符串,这是输入后在浏览器中看到的实际 URL 字符串。如果内存中表示的方案是“文件”,则此序列化总是将冒号双斜杠 :// 附加到输出字符串。
此行为在 WHATWG URL 标准 [1] 中进行了概述,请参阅 URL-Parsing (file-state) [2] 和 URL-Serializing [3]。
这个序列化问题是否是对 URL 的更严格要求的结果,这是我(也)想知道的,但是 RFC 8089 的附录 A 指出:
'根据 [RFC1738] 中的定义,文件 URL 始终以标记“file://”开头,后跟(可选空白)主机名和“/”。第 2 节中给出的语法使整个权限组件,包括双斜杠“//”,都是可选的。
由于该评论明确提到了 URL,我将其解释为通过 RFC 8089 的第 2 节中的语法,授权组件对于 URL(不仅仅是更广泛的 URI 定义)是可选的。WHATWG URL 标准似乎在这方面遵循 RFC1738。当解析和重新序列化的输出形式都相等时,它实际上认为两个 URL 是等效的,您的示例就是这种情况。因此,该行为似乎不符合最新标准,RFC 8089 也对此发出警告。
[1] https://url.spec.whatwg.org
[2] https://url.spec.whatwg.org/#file-state
[3] https://url.spec.whatwg.org/#url-serializing