如何在Web服务器上解码请求URI中的保留转义字符?

7
很明显,Web服务器必须解码任何转义的未保留字符(例如字母数字等)以进行URI比较。例如,http://www.example.com/~user/index.htm应与http://www.example.com/%7Euser/index.htm相同。

我的问题是,我们该如何处理转义的保留字符?

一个例子是%2F/。如果请求URI中有%2F,Web服务器的解析器是否应将其替换为/?在上面的例子中,这意味着http://www.example.com/~user%2Findex.htm将与http://www.example.com/~user/index.htm相同吗?尽管我在Apache服务器(2.2.17 Unix)上尝试了一下,但看起来它会给出“404 Not Found”错误。

那么这是否意味着%2F和其他转义的保留字符应该被保留(至少在URI比较之前)?

背景信息:

RFC 2616(HTTP 1.1)中提到了两个关于转义解码问题的地方:

请求URI以3.2.1节指定的格式传输。如果使用“%HEX HEX”编码[42]对请求URI进行编码,则原始服务器必须解码请求URI以便正确解释请求。服务器应该使用适当的状态代码响应无效的请求URI。

除了“保留”和“不安全”集合中的字符(请参见RFC 2396 [42])之外的字符等同于它们的“%HEX HEX”编码。

(根据http://trac.tools.ietf.org/wg/httpbis/trac/ticket/2,“不安全”是一个错误,将从规范中删除。所以我们只关注“保留”这里。)

供您参考,RFC 2396中这些字符的定义:

保留字符 = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 非保留字符 = 字母数字 | 标记 标记 = "-" | "_" | "." | "!" | "˜" | "*" | "’" | "(" | ")"

我认为这篇文章已经回答了问题。干得好 :-) “除了”保留集合和不安全集合(参见RFC 2396 [42])中的字符,“其他字符等同于它们的“%HEX HEX”编码。” 我怀疑URI的片段部分更自由。 - user166390
1个回答

3

简短总结:

解码百分号编码的未保留字符,
保留百分号编码的保留字符。


URI标准是STD 66,目前是RFC 3986

第6节是关于“归一化和比较”的内容,其中第6.2.2.2节解释了如何处理百分号编码的八位字节:

这些URI应通过解码对应于未保留字符的任何百分号编码八位字节来进行归一化 […]

正如在第2节中明确说明的(我加粗了):

  • 未保留字符

    用相应的百分号编码的US-ASCII八位字节替换未保留字符的URI是等效的

  • 保留字符

    用相应的百分号编码的八位字节替换保留字符的URI是不等效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接