首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RFC2396 -什么是有效的路径段?

RFC2396 -什么是有效的路径段?
EN

Stack Overflow用户
提问于 2011-03-30 16:46:10
回答 2查看 2.1K关注 0票数 2

问题区

我需要定义一个特定的路径段对RFC2396是否有效。说明书上写着:

代码语言:javascript
复制
path_segments = segment *( "/" segment )
segment       = *pchar *( ";" param )
param         = *pchar
pchar         = unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | ","
unreserved    = alphanum | mark
mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
escaped       = "%" hex hex
hex           = digit | "A" | "B" | "C" | "D" | "E" | "F" |
                        "a" | "b" | "c" | "d" | "e" | "f"

因此,例如,/foo是一个有效的路径段,但/fo?o不是因为非转义的?。要更正上面的示例,路径段应该写成/fo%3Fo

但是,Spec只定义到达服务器的URL的有效性(例如:输入URL栏)。

我实际上需要验证的是,未转义的路径段是否有效。继续上面的示例,/fo?o将是一个有效的资源,因为?是在未转义%3F时得到的。

这也意味着URL http://foo.com/first/sec%2fond将解析为两个未转义的路径段,/first/sec/ond,后者不仅必须被看作是一个单个段,而不是两个单独的段,而且在语法上也是有效的(作为一个未转义的路径段)。

问题

  • 我正确地理解了规范吗?
  • 有人能为未转义的路径段建议Java验证器吗?
  • 有人能提出一个不平凡的失败案例吗?
  • U+00FF以上的字符如何,它们不能用于路径段吗?我以为他们得到了支持,至少在域名上是这样的。

编辑:正如迈克正确指出的,RFC3986淘汰了RFC2396。无论如何,我相信新的RFC比旧的RFC处理更多的情况(并且不会使某些路径段不合法),因此同样的问题也适用。

EN

回答 2

Stack Overflow用户

发布于 2011-03-30 17:10:48

我将以您所做的方式来解释该规范;也就是说,sec%2Fond是一个单一路径段。(但是--任何创建具有类似段的URI的人都应该受到严厉的惩罚!)

您要解决的问题是,非转义过程是lossey的;您不能从转义URI返回到未转义的String,然后返回原始的转义URI。这是无法避免的;在任何“有用”处理丢弃关键信息之前,您必须先获得转义URI。

有关处理非ASCII字符的详细信息,您可以阅读§2.1,但我的理解是,RFC 2396中的转义规则适用于URI字符串编码后的八进制字符串(字节)。字符编码的执行方式可以由该方案指定;没有通用方法。

票数 2
EN

Stack Overflow用户

发布于 2011-03-30 17:11:40

因此,例如,/foo是一个有效的路径段,但/fo?o不是因为非转义?要更正上面的示例,路径段应该写成/fo%3Fo。

对,是这样

这也意味着URL http://foo.com/first/sec%2fond将解析为两个未转义的路径段,/first和/sec/ond,后者不仅必须被视为一个单独的段,而不是两个单独的段,而且在语法上也是有效的(作为一个未转义的路径段)。

对,是这样。但是,有许多实现会导致这一错误。

U+00FF以上的字符如何,它们不能用于路径段吗?我以为他们得到了支持,至少在域名上是这样的。

URI转义(%十六进制)编码字节。不是代号。您需要知道URL的编码。例如,如果编码为UTF-8,则编码点U+1234被编码为%E1%88%B4.

域名中不允许转义的百分比。有关国际域名,请参见RFC 3492

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5489379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档