为什么URI构造函数的URI参数中允许使用未经百分比编码的保留特殊字符(正斜杠)?

时间:2018-12-16 19:58:32

标签: java uri

为什么下面的代码在运行时不会将URISyntaxException作为非法URI抛出?

new URI("http:us//er:ps//w@si//te.c/om/dir1/di//r2/fi//le.txt#frag//ment");

// or same with "http:// ... "
new URI("http://us//er:ps//w@si//te.c/om/dir1/di//r2/fi//le.txt#frag//ment");

根据wikipedia/”是保留的(特殊)字符,应将其百分比编码(也称为URL编码)为%2F

  

例如,如果保留字符/ 用于URI的“路径”组件,则其特殊含义是成为路径 之间的分隔符细分 如果,则根据给定的URI方案, /必须位于路径段中然后用三个字符%2F或{必须在细分中使用{1}},而不是原始的%2f

但是URI构造函数不允许对其进行URL编码!

Wikipedia defines URI格式如下( RFC 3986 第3部分(2005年)):

/

并且URI构造函数允许在任何组件中直接使用URI = scheme:[//authority]path[?query][#fragment] (未经百分比编码)(可能是方案的例外)。

URI Javadoc states

  

此构造函数完全按照   RFC 2396,附录A,中的语法,除了以下差异:   ...

     凡是RFC 2396的地方,都允许使用

other 类别中的字符   允许转义八位字节,即在用户信息,路径,查询,   和片段部分,以及授权部分(如果   权限是基于注册表的。这允许URI包含Unicode   超出US-ASCII字符集中的字符。

这允许使用非百分比编码的“其他”字符(请参见上面的Wiki链接以了解保留的/未保留的/其他字符的说明),例如ɷ(非ASCII),因此这与保留无关像正斜杠之类的字符。

但是无论如何-为什么以及为什么?

P.S。 Wikipedia解释了为什么我们可以在其他组件中使用正斜杠,但是为什么在路径组件(目录名,文件名)中仍可以使用正斜杠仍然不清楚。

  
    

在特定上下文中没有保留目的的保留字符也可以是百分比编码的,但在语义上与没有保留目的的字符没有区别。

  
     

在URI的“查询”组件中(?字符后的部分),用于   例如, /仍被视为保留字符 ,但通常   没有保留的目的除非特定的URI方案说   否则。字符在字符时不需要进行百分比编码   没有保留的目的。

1 个答案:

答案 0 :(得分:1)

好吧,所以问题实际上是为什么URI的path元素允许/。

在第一个Wikipedia注释中,您清楚地显示了/是路径段之间的分隔符。 (路径元素!=路径段)

您必须在其中路径段中转义。

您绝不能逃避 DELIMIT 路径段的

URI:http://address.com/path%2fSegment1/path%2fSegment2/path%2fSegment3