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

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 =" - "| "_"| "" | "!" | "〜"| "*"| "'"| "("|")"

uno*_*nor 3

长话短说:

\n

解码百分比编码的非保留字符,
\n保留百分比编码的保留字符。

\n
\n

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

\n

第 6 节是关于规范化和比较,其中第 6.2.2.2 节解释了如何处理百分比编码的八位字节:

\n
\n

这些 URI 应通过解码与未保留字符 [\xe2\x80\xa6] 对应的任何百分比编码八位字节来规范化

\n
\n

正如第 2 节中明确指出的(粗体强调是我的):

\n
    \n
  • 未保留字符

    \n
    \n

    在将非保留字符替换为相应的百分比编码 US-ASCII 八位字节方面有所不同的 URI等效的

    \n
    \n
  • \n
  • 保留字符

    \n
    \n

    在将保留字符替换为相应的百分比编码八位字节方面存在差异的 URI 并不等效

    \n
    \n
  • \n
\n