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

1 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

url参数http://journals.plos.org/plosone/s/file?id=wjVg/PLOSOne_formatting_sample_main_body.pdf,不进行编码.它包含保留字符,如冒号,斜杠和问号.

为什么这仍然有效?为什么在没有它的情况下工作呢?

uno*_*nor 7

URI 的保留字符主要用作分隔符 - 它并不意味着它们可能不被使用,它只意味着它们具有特殊用途,如果您不需要它们用于此目的,则必须百分比编码它们.

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

URI标准RFC 3986 定义查询组件可以包含以下字符:

  • a- z,A-Z
  • 0- 9
  • / ? : @ ! $ & ' ( ) * + , ; = - . _ ~
  • 百分比编码的字符

它甚至明确提到:

字符斜杠("/")和问号("?")可以表示查询组件中的数据.


示例URI的查询组件是:

embedded=true&url=http://journals.plos.org/plosone/s/file?id=wjVg/PLOSOne_formatting_sample_main_body.pdf
Run Code Online (Sandbox Code Playgroud)

除了字母,它包含=,&,:,/,.,?,_,所有这些都让在查询中.

请注意,查询组件中的name=value格式(由分隔开&)只是一个约定,而不是规范中定义的内容.