浏览器和PHP对于参数的encode和decode处理
先说明一下PHP对于url的编码方式:
1.rawurlencode和rawurldecode
这种方式会将特殊符号编码为%加上两位字母或者数字,空格会被编码为%20
2.urlencode和urldecode
这种方式会将特殊符号编码为%加上两位字母或者数字,空格会被编码为+
浏览器在发送请求时会自动进行 url 编码,这是传输协议规定的,且采用的是类似rawurlencode的方法,即空格会被编码为%20
比如我在浏览器中(Chrome和IE都测试过)输入:http://util.10jqka.com.cn/test.php?a=a b
那么在nginx日志中,看到传递上来的是:http://util.10jqka.com.cn/test.php?a=a%20b
而PHP中,通过$_REQUEST[‘a’]获取到的,是解码后的内容,即a b
PHP解码采用的是urldecode,注意,这里不是rawurldecode
比如我在浏览器中(Chrome和IE都测试过)输入:http://util.10jqka.com.cn/test.php?a=a+b
那么在nginx日志中,看到传递上来的是:http://util.10jqka.com.cn/test.php?a=a+b
而PHP中,通过$_REQUEST[‘a’]获取到的值为a b,可以看到+号被解码成空格了,即采用的是urldecode
这样就存在一个问题:如果我们的url中,含有一些+号,此时浏览器通过rawurlencode对url中的参数进行加密,是不会处理+号的,+号会直接传递到服务器;我们在服务器上,PHP对url中的参数采用urldecode解密,这些+号就会被转为空格,这样参数传递就出现错误了。
因此:
1.url中,不要出现+号
2.如果参数里面确实需要传递+号,采用POST方法传输
常见的场景,比如问财的搜索接口,用户经常会传入类似“今日涨幅大于3%的股票+市盈率小于10的股票”
浏览器的转义,仅针对GET方式的请求,POST方式的请求不会进行这个转义。