【问题标题】:Should I url encode a query string parameter that's a URL?我应该对作为 URL 的查询字符串参数进行 url 编码吗?
【发布时间】:2014-11-16 18:09:58
【问题描述】:

只要说我有以下 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 也不包含任何查询字符串参数,可以这样做吗?

【问题讨论】:

    标签: url urlencode


    【解决方案1】:

    RFC 2396 sec. 2.2 表示您应该对那些不用于明确含义的符号进行 URL 编码;也就是说,您应该始终形成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 数组已经为您完成了这项工作;在其他语言中,您需要拆分第一个 ? 字符,然后拆分 & 字符,然后拆分第一个 = 字符,然后对名称和值进行 urldecode。

    【讨论】:

    • RFC 3986 使 RFC 2396 过时。也许这个答案需要更新。
    【解决方案2】:

    根据RFC 3986

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

    所以下面的 URI 是有效的:

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

    following excerpt from the RFC 说明了这一点:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 2012-06-02
      • 2017-06-13
      • 2016-07-07
      相关资源
      最近更新 更多