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中这些字符的定义:
保留字符 = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 非保留字符 = 字母数字 | 标记 标记 = "-" | "_" | "." | "!" | "˜" | "*" | "’" | "(" | ")"