为什么即使参数不是URL编码的某些查询字符串也能工作?

时间:2016-08-07 00:07:55

标签: url url-encoding

以下是一个例子:

  

https://drive.google.com/viewerng/viewer?embedded=true&url=http://journals.plos.org/plosone/s/file?id=wjVg/PLOSOne_formatting_sample_main_body.pdf

<div class="row"> <div class="col-xs-3 col-sm-3"> <p> Customer name: Foo </p> </div> <div class="col-xs-3 col-sm-3"> <p> Customer name: bob </p> </div> <div class="col-xs-3 col-sm-3"> <p> Customer name: jim </p> </div> </div> <div class="row"> <div class="col-xs-3 col-sm-3"> <p> Customer name: dave </p> </div> <div class="col-xs-3 col-sm-3"> <p> Customer name: lucy </p> </div> <div class="col-xs-3 col-sm-3"> <p> Customer name: sarah </p> </div> </div> <div class="row"> <div class="col-xs-3 col-sm-3"> <p> Customer name: geoff </p> </div> <div class="col-xs-3 col-sm-3"> <p> Customer name: matt </p> </div> <div class="col-xs-3 col-sm-3"> <p> Customer name: alex </p> </div> </div> 参数url未编码。它包含保留字符,如冒号,斜杠和问号。

为什么这仍然有效?如果没有它,为什么还要编码?

3 个答案:

答案 0 :(得分:6)

URI的reserved characters主要用作分隔符 - 它并不意味着它们可能不被使用,它只意味着它们有特殊用途,如果你不需要它们这个目的,你必须对它们进行百分比编码。

查询组件以第一个?开头,以第一个#结束(如果有的话,或者以URI结尾)。对于查询组件本身,没有定义保留字符。

查询组件可以包含这些字符的URI标准RFC 3986 defines

  • a - zA - Z
  • 0 - 9
  • / ? : @ ! $ & ' ( {{ 1}} ) * + , ; = - . _
  • 百分比编码字符

它甚至明确提到:

  

字符斜杠(&#34; /&#34;)和问号(&#34;?&#34;)可能代表查询组件中的数据。

示例URI的查询组件是:

~

除了字母外,它还包含embedded=true&url=http://journals.plos.org/plosone/s/file?id=wjVg/PLOSOne_formatting_sample_main_body.pdf =&:/.? ,查询中允许所有这些。

请注意查询组件is just a convention中的_格式(由name=value分隔),而不是规范中定义的内容。

答案 1 :(得分:0)

这来自相关的RFC,1738:

  

https://www.ietf.org/rfc/rfc1738.txt

     

3.3。 HTTP

     

HTTP URL方案用于指定Internet资源
  可以使用HTTP(超文本传输​​协议)访问。

     

HTTP协议在别处指定。本规范仅供参考   描述了HTTP URL的语法。

     

HTTP URL采用以下形式:

  http://<host>:<port>/<path>?<searchpart>
     

其中和如第3.1节所述。如果:   省略,端口默认为80.没有用户名或密码为
  允许。 <path>是HTTP选择器,<searchpart>是查询
  串。 <path>是可选的,<searchpart>及其中也是可选的   在“?”之前。如果<path><searchpart>都不存在,则“/”   也可以省略。

     

<path><searchpart>组件中,“/”,“;”,“?”是
  保留。可以在HTTP内使用“/”字符来指定
  等级结构。

“http://”中的特殊字符仅适用于URL开头的“协议”规范。它在大多数浏览器中都是可选的(隐式“http://”)。

第一个“?”将“路径”与“搜索部分”分开。每个“&amp;”在“searchpart”中分隔不同的参数。

您的浏览器应该区分?embedded=true&url=http://www.pdf995.com/samples/pdf.pdf

'希望有所帮助

答案 2 :(得分:0)

因为在url中某些字符具有特殊含义,所以使用问号(?)将路径与查询分开,使用&符号(&amp;)作为键值对之间的分隔符。因此,对于这样的字符,如果我们将它们用作查询字符串中的值,浏览器会感到困惑,我们使用编码,以便我们可以确保数据不含糊。您显示的所有这些字符都不会被模糊处理,因为它们根据http URL架构在有效位置使用。