在 RFC3986 的上下文中,术语“path-abempty”中的“abempty”是啥意思?
Posted
技术标签:
【中文标题】在 RFC3986 的上下文中,术语“path-abempty”中的“abempty”是啥意思?【英文标题】:What does "abempty" mean in the term "path-abempty" in the context of RFC3986?在 RFC3986 的上下文中,术语“path-abempty”中的“abempty”是什么意思? 【发布时间】:2017-04-15 19:08:24 【问题描述】:见:https://www.rfc-editor.org/rfc/rfc3986#section-3
还有:https://www.rfc-editor.org/rfc/rfc3986#section-3.3
“abempty”的由来对我来说很神秘,快速搜索并没有找到它的任何定义。
【问题讨论】:
【参考方案1】:“abempty”,正如它在您引用的 rfc 中其用法右侧的 cmets 中所述,意味着它的值可以是 absolute path 或 empty 所以(abempty)。
【讨论】:
【参考方案2】:“Abempty”,意思是远离空,描述了路径与其先前权威的关系。在 path-abempty 相关的地方,hier-part 由“//”、权限和 path-abempty 组成。权限组件的长度可能为零——scheme:/// 是一个有效的 URI。
但是,当权限为零长度且路径为空时,无法区分这两个组件,因此是无路径路径 - 它“以“/”开头或为空”(第 3.3 节)取决于视情况而定。
来源:http://w3-org.9356.n7.nabble.com/path-abempty-in-URI-td170118.html(参见菲尔丁对 Petch 的回复。)
注意“abempty”这个词并不是绝对和空虚这两个词的组合。
请:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part 在“通用”URI 的上下文中不是可选的。
hier-part = ("//" authority path-abempty) / path-absolute / path-rootless / path-empty
双斜线,有趣的是,不是可选的,其中路径-abempty 是相关的。而且,稍微向前一点,权限可能是零长度:
reg-name = *( unreserved / pct-encoded / sub-delims )
当hier-part 由“//”、权限和path-abempty 组成时,Path-abempty 是相关的。 Path-abempty 定义为:
path-abempty = *( "/" segment )
RFC 规定,“当存在权限时,路径必须为空或以斜杠 (“/”) 字符开头。”如果 reg-name 的长度为零,随意阅读该语句可能会表明以下 URI 是有效的:
scheme://
不是。下一句指出,“当权限不存在时,路径不能以两个斜杠字符('//')开头。”这意味着在解析以“scheme://”开头的 URI 时,我们指出了零长度权限和零长度路径的可能性——否则我们可能会停在那里,因为 URI 将是无效的。
在这种情况下,无论如何都不是常见的情况,无法从零长度路径中辨别出零长度权限。因此,当权限是零长度时,我们没有选择,路径必须以正斜杠开头(更准确地说,它必须匹配 path-abempty)和 从权威中辨别路径;否则,我会再说一遍:URI 将无效。
“abempty”一词并不意味着路径可能是绝对的或空的。这个词的意思是路径必须区别于权威,因此它是abempty,即远离空。
示例:
这个 URI 是模棱两可的,因为即使它具有长度为零的权限和长度为零的路径,也无法将其与忽略权限且路径以两个正斜杠开头的无效 URI 区分开来。
scheme://
这个 URI 没有歧义,因为它清楚地包含一个长度为零的权限和一个无路径路径。
scheme:///
【讨论】:
【参考方案3】:鉴于其在RFC 3986, Section 3.3 中的定义和上下文:我相信abempty 是absolute 和empty 的组合;与带有拉丁 ab-前缀的 empty 相对。
可能的路径模式定义为:
path-abempty = *( "/" segment ) ; begins with "/" or is empty
path-absolute = "/" [ segment-nz *( "/" segment ) ] ; begins with "/" but not "//"
path-noscheme = segment-nz-nc *( "/" segment ) ; begins with a non-colon segment
path-rootless = segment-nz *( "/" segment ) ; begins with a segment
path-empty = 0<pchar> ; zero characters
Path-abempty 本质上是一个extended path-absolute,结合了path-empty。
Path-absolute-or-empty 变为 path-abempty。
免责声明
我的断言完全基于推理猜想,因为我找不到这个词的词源,或者是谁创造了它。因此,如果有人有相关知识,可以反驳或证实:请分享!
【讨论】:
BNF 符号并不意味着什么。 “绝对路径或空路径变为可空路径。”什么是 ”///”?这不是绝对路径。它不是空的。它是无路的。 正确。如前一个要点中的“扩展”所述。我可以将这个词加粗,也许可以使用 Path-extended-absolute-or-empty 使其更明确。不过,可能会更分散注意力。 我注意到“扩展”,这就是我引用第二个项目符号的原因。关于第一个项目符号,我看不出 path-abempty 本质上是 path-absolute 的扩展,因为它们没有在相同的 URI 上下文中使用。仅当权限不存在时,绝对路径才相关。 “不存在”意味着它不是 URI 的一部分——不仅仅是它的长度为零。以上是关于在 RFC3986 的上下文中,术语“path-abempty”中的“abempty”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
The valid characters are defined in RFC 7230 and RFC 3986
如何让 Uri.EscapeDataString 符合 RFC 3986
为啥 %(百分比)在 RFC 3986(URI 语法)中不被视为保留字符?