我应该对作为URL的查询字符串参数进行URL编码吗?

30

假设我有一个包含查询字符串参数的URL:

http://www.someSite.com?next=http://www.anotherSite.com?test=1&test=2

我应该对next参数进行URL编码吗?如果我这样做,是Web浏览器还是我的Web应用程序负责解码它?

我问这个问题的原因是我看到很多大型网站做了如下操作:

http://www.someSite.com?next=http://www.anotherSite.com/another/url

在上面的例子中,它们没有对 next 参数进行编码,因为我猜想他们知道它本身没有任何查询字符串参数。如果我的 next URL 也不包含任何查询字符串参数,那么这种做法可以吗?

2个回答

21

RFC 2396第2.2节指出,您应该对那些没有明确含义的符号进行URL编码;也就是说,您应该始终形成targetUrl + '?next=' + urlencode(nextURL)

Web浏览器根本不会“解码”这些参数;浏览器只是传递整个字符串,而不知道参数的任何信息。浏览器以以下方式GET请求形式为http://www.example.com/path/to/query?param1=value&param2=value2

GET /path/to/query?param1=value&param2=value2 HTTP/1.1
Host: www.example.com
(other headers follow)

在后端,您需要解析结果。我认为 PHP 的 $_REQUEST 数组已经为您完成了此操作; 在其他语言中,您需要先通过第一个 ? 字符分割,然后通过 & 字符分割,再通过第一个 = 字符分割,最后对名称和值都进行 urldecode。


3
RFC 3986使RFC 2396过时。也许这个答案需要更新。 - Thomas Turrell-Croft

19
根据RFC 3986规定:

查询组件由第一个问号(“?”)字符表示,并以数字符号(“#”)字符或URI的结尾终止。

因此,以下URI是有效的: http://www.example.com?next=http://www.example.com RFC中的以下节选说明了这一点:

...由于查询组件经常用于以“键=值”对的形式携带标识信息,而且经常使用的一个值是对另一个URI的引用,因此为了可用性,避免对这些字符进行百分比编码通常更好。

值得注意的是,RFC 3986使RFC 2396过时。

如果“next” URI本身有查询参数,那应该只对这些参数进行编码,还是整个URI都要编码? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接