网络标准中规定:
只有字母、数字和一些特殊符号“$±_!*’()”以及一些保留字可以不进行编码直接用于URL。而其他的字符和文字用于URL时,不同的浏览器对URL的编码是不同的。
1) URL要统一的命名因特网上所有的资源,这就意味着它要通过不同的协议安全的传输这些资源,但是有一些传输协议在传输的过程中会自动剥去某些字符。导致URL上可以出现的字符的种类受限。
2) URL还需要是完整的,人们希望URL上可以出现其他的不安全的字符或者汉字,但是为了适用于所有的网络传输协议,需要一种转义机制,将不安全的字符转义成安全的字符。
为了实现URL上字符的完整性,提出一种转义机制,将一些不安全的字符转义成安全字符,另外,一些保留字符在将其用于保留用途之外的其他场合时,一定要将其进行转义,不然其他的应用程序可能会对它产生迷惑。
比如:以下字符都是在URL中有特殊作用。
%:保留字,作为编码字符的转义标志
?:保留字,作为查询字符串的标志
.:保留字,在路径组件中使用
/:保留字,在路径组件中作为分隔字符
#:保留字,作为分段定界符使用
等等
前端为什么要对URL进行编码?
例1:假设URL上有这样一段参数,name1=value1&name2=value2
当该URL传输到服务器端时,上述字符串在计算机中用ASCII码表示为:
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532对应关系:
6E616D6531 --> name1
3D --> =
76616C756531 --> value1
26 --> &
6E616D6532 --> name2
3D --> =
76616C756532 --> value2
服务器端在接收到该数据后会依次遍历该字节流,识别=和&,可以解析出从客户端传过来的参数,表明它是两个键值对。
如果参数里面包含=或者&这种特殊字符咋办?
比如name1=va&lu=el,这样服务器就会误以为我们传输的是两个键值对,就会造成歧义。为了解决上述问题,我们可以对参数进行编码,编码后“name1=va%26lu%3D”,这样服务器就会正常解析出参数,把%后面的参数当成正常的字符。
总结:当参数中出现特殊字符时一定要对参数进行编码
例2:当URL参数中包含一个URL时,一定要进行编码
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http://api.baidu.com/callback.php
这样的URL一定会出问题,所以一定要对http://api.baidu.com/callback.php进行编码,再放到地址中发送。
例3:假如URL中有中文时,一定要进行编码