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

Bra*_*rks 13 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网址不包含任何查询字符串参数,这可以吗?

Tho*_*oft 19

根据RFC 3986

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

因此以下 URI 是有效的:

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

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

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

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


CR *_*ost 12

RFC 2396秒.2.2表示你应该将那些符号用URL编码,而不是用于它们的明确含义; 即你应该永远形成targetUrl + '?next=' + urlencode(nextURL).

Web浏览器根本不"解码"那些参数; 浏览器对参数一无所知,只是传递了字符串.表单的查询字符串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)
Run Code Online (Sandbox Code Playgroud)

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

  • RFC 3986 使 RFC 2396 过时。也许这个答案需要更新。 (2认同)