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

Parsing 如何在web服务器上解码请求URI中的保留转义字符?,parsing,url,escaping,uri,percent-encoding,Parsing,Url,Escaping,Uri,Percent Encoding,很明显,web服务器必须解码任何转义的无保留字符(如alphanums等)才能进行URI比较。例如,http://www.example.com/~user/index.htm应与http://www.example.com/%7Euser/index.htm 我的问题是,我们该怎么处理转义的保留字符 例如%2F,或/。如果请求URI中存在%2F,web服务器的解析器是否应该将其替换为/?在上面的示例中,这意味着http://www.example.com/~user%2finder.htm将与

很明显,web服务器必须解码任何转义的无保留字符(如alphanums等)才能进行URI比较。例如,
http://www.example.com/~user/index.htm
应与
http://www.example.com/%7Euser/index.htm

我的问题是,我们该怎么处理转义的保留字符

例如
%2F
,或
/
。如果请求URI中存在
%2F
,web服务器的解析器是否应该将其替换为
/
?在上面的示例中,这意味着
http://www.example.com/~user%2finder.htm
将与
http://www.example.com/~user/index.htm
?虽然我在Apache服务器(2.2.17 Unix)上尝试了它,但它似乎给出了一个“404NotFound”错误

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

背景资料: RFC 2616(HTTP 1.1)中有两处提到了转义解码问题:

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

“保留”和“不安全”集合中的字符(参见RFC 2396[42])以外的字符与其“%”十六进制编码等效

(根据“不安全”是一个错误,应从规范中删除。因此,我们仅在此处查看“保留”。)

仅供参考,RFC 2396中此类字符的定义:

保留=“;”|“/”|“?”|“:“|“@”|“&”|“=”|“+”|“$”|“,”

无保留=字母数|标记

mark=“-”|“|”|“!”|“|”|“|”*“|””“|”(“|”)”


tl;医生:

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


URI标准是,目前是

是关于规范化和比较的,其中说明了如何处理百分比编码的八位字节:

这些URI应该通过解码对应于无保留字符的任何百分比编码八位字节来规范化[…]

如(粗体强调)中明确所述:

  • :

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

  • :

    在用相应的编码八位字节百分比替换保留字符方面有所不同的URI是不等效的


我认为这篇文章本身就是答案。干得好:-)“保留”和“不安全”集合中的字符(参见RFC 2396[42])之外的其他字符相当于它们的“%”十六进制编码。“我怀疑URI的片段部分更自由。