3

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

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

...

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

...

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

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

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

当我需要不断解码只是带有斜杠的字母数字的 url 参数时,它让我发疯。

下面是一个生活例子:

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

对比

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

4

1 回答 1

2

请注意,RFC 3986更新了 RFC 1738(尽管没有废弃它,我认为这表明它的目的是澄清而不是矛盾)。

RFC 3986 在第 3.4 节中说,queryURI 部分的语法是:

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 的一部分中包含保留字符时才需要对字符进行编码(此处不适用)。

于 2012-07-02T23:24:17.177 回答