我们应该在URL的搜索部分编码斜杠吗?

时间:2011-09-15 19:53:19

标签: url rfc

rfc 1738对于“搜索部分”中的正斜杠编码并不准确:

  

如果在方案中保留与八位字节对应的字符,则必须对八位字节进行编码。

     

...

     

只有字母数字,特殊字符“$ -_。+!*'(),”和    可以使用用于其保留目的的保留字符    在URL中未编码。

     

...

     

在'path'和'searchpart'组件中,​​“/”,“;”,“?”保留。

您是否知道网址搜索部分中“/”的“保留目的”是什么?

是否有任何真正的理由遵循规范并对正斜杠进行编码 我的服务器处理未编码的斜杠?

当我需要不断解码带有斜杠的字母数字的urls参数时,它让我疯狂。

这是一个生活的例子:

http://localhost/login?url=/a/path/to/protected/content

VS

http://localhost/login?url=%2Fa%2Fpath%2Fto%2Fprotected%2Fcontent

1 个答案:

答案 0 :(得分:2)

请注意RFC 3986更新了RFC 1738(虽然没有废弃它,我认为这表明它旨在澄清而不是相互矛盾)。

RFC 3986在3.4节中说,URI的query部分的语法是:

query       = *( pchar / "/" / "?" )

URI的ABNF可方便地收集在附录A中,表示

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded   = "%" HEXDIG HEXDIG
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

这非常明确地表明在请求部分中斜杠是合法的,因此不需要进行编码。特别是,您的示例http://localhost/login?url=/a/path/to/protected/content很好,http://localhost/login?abc123-.+~!$&'()*+,;=%00/?:@

也是如此

第2.4节指出只有当一个人想要在URI的一部分中包含保留字符时才需要编码字符(这里不适用)。