我应该url编码一个URL的查询字符串参数吗?

时间:2014-09-22 17:26:52

标签: url urlencode

只是说我有以下的url,它的查询字符串参数是url:

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

我应该对next参数进行url编码吗?如果我这样做,谁负责解码它 - 网络浏览器,或我的网络应用程序?

我问的原因是我看到许多大型网站都做了类似下面的事情

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

在上面,他们不打扰编码next参数因为我猜,他们知道它本身没有任何查询字符串参数。如果我的next url也不包含任何查询字符串参数,这样做可以吗?

2 个答案:

答案 0 :(得分:8)

RFC 2396 sec. 2.2表示您应该将这些符号进行网址编码,而这些符号不会用于其明确含义;即你应该始终形成targetUrl + '?next=' + urlencode(nextURL)

网络浏览器无法解码'那些参数;浏览器对参数一无所知,只是传递了字符串。形式为http://www.example.com/path/to/query?param1=value&param2=value2的查询字符串由浏览器GET请求:

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

在后端,您需要解析结果。我认为PHP的$_REQUEST数组已经为你完成了这个;在其他语言中,您希望拆分第一个?字符,然后拆分&个字符,然后拆分第一个=字符,然后将名称和价值。

答案 1 :(得分:0)

根据RFC 3986

<块引用>

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

所以以下 URI 是有效的:

http://www.example.com?next=http://www.example.com

RFC 的以下摘录清楚地说明了这一点:

<块引用>

... 作为查询组件,常用于携带标识 以“键=值”对和一个经常使用的形式的信息 value 是对另一个 URI 的引用,有时更适合 避免对这些字符进行百分比编码的可用性。

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