在 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 中的定义和上下文:我相信abemptyabsoluteempty 的组合;与带有拉丁 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-emptyPath-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 字符串进行转义

为啥 %(百分比)在 RFC 3986(URI 语法)中不被视为保留字符?

RFC 3986 中关于非英文字符的“不区分大小写”是啥意思?

什么样的 URL 不符合 RFC 3986 但符合 RFC 1808、RFC 1738 和 RFC 2732?