J. *_*Yip 5 url parsing uri escaping percent-encoding
很明显,Web服务器必须解码任何转义的未保留字符(例如alphanums等)来进行URI比较.例如,http://www.example.com/~user/index.htm应该相同http://www.example.com/%7Euser/index.htm.
我的问题是,我们要对逃脱的保留字符做什么?
一个例子是%2F,或/.如果%2F请求URI中有一个,那么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)中有两处提到转义解码问题:
Request-URI以3.2.1节中指定的格式传输.如果使用"%HEX HEX"编码[42]对Request-URI进行编码,则源服务器必须解码Request-URI以正确解释请求.服务器应该使用适当的状态代码响应无效的Request-URI.
和
除"保留"和"不安全"集合之外的字符(参见RFC 2396 [42])等同于它们的"%"HEX HEX"编码.
(根据http://trac.tools.ietf.org/wg/httpbis/trac/ticket/2"unsafe "是一个错误,应从规范中删除.所以我们只看这里的"保留".)
仅供参考,RFC 2396中此类字符的定义:
reserved =";" | "/"| "?" | ":"| "@"| "&"| "="| "+"| "$"| ""
未保留的= alphanum | 标记
mark =" - "| "_"| "" | "!" | "〜"| "*"| "'"| "("|")"
长话短说:
\n解码百分比编码的非保留字符,
\n保留百分比编码的保留字符。
第 6 节是关于规范化和比较,其中第 6.2.2.2 节解释了如何处理百分比编码的八位字节:
\n\n\n这些 URI 应通过解码与未保留字符 [\xe2\x80\xa6] 对应的任何百分比编码八位字节来规范化
\n
正如第 2 节中明确指出的(粗体强调是我的):
\n\n\n在将非保留字符替换为相应的百分比编码 US-ASCII 八位字节方面有所不同的 URI是等效的
\n
保留字符:
\n\n\n在将保留字符替换为相应的百分比编码八位字节方面存在差异的 URI 并不等效。
\n