平时在工作中经常要写 $xxx = urldecode($_GET['xxx']);的类似代码,大部分的情况都是没有问题的.也能很好的工作.
所以也没有怎么在意.但是突然有一天我想到 $xxx =$_GET['xxx']和$xxx = urldecode($_GET['xxx']); 获取的值都是一样的,那为何还需要做一次urldecode呢
为此我做一下测试.
我的测试代码1.php 如下
<?php
var_dump($_GET);
只是将请求上带的参数值打印出来而已
我们以中国为例子进行说明
我们分成以下3中情况
a 当 中国 未进行urlencode编码的时候
测试地址: http://xxx.com/1.php?a=中国
执行的结果:
array (size=1)
'a' =>
string
'中国' (length=6)
b 当 中国 进行一次urlencode编码的时候 ===>%E4%B8%AD%E5%9B%BD
测试地址: http://xxx.com/1.php?a=%E4%B8%AD%E5%9B%BD
测试地址: http://xxx.com/1.php?a=%E4%B8%AD%E5%9B%BD
执行的结果:
array (size=1)
'a' =>
string
'中国' (length=6)
c 当 中国 进行2次urlencode编码的时候===> %25E4%25B8%25AD%25E5%259B%25BD
测试地址: http://xxx.com/1.php?a=%25E4%25B8%25AD%25E5%259B%25BD
执行的结果:
array (size=1)
'a' =>
string
'%E4%B8%AD%E5%9B%BD' (length=18)
从以上可知
当我们用$_GET的时候其实已经进行了一次urldecode的操作.
这里特别要说明一点的是 a的情况,明明传入值就是中国,按照刚才的说明获取GET的时候已经做过一次urldecode,那么为何得到值还是中国呢 ?
原因是urldecode('中国')的值就是中国.
所以如果我们程序中如果有以下的代码的话
$a = urldecode($_GET['a']);的时候其实我们已经不经意间做了2次urldecode ------>这一点请务必注意
为何我特别指出我们要注意这个问题呢?
主要是我做的项目很多需要微信授权,而授权服务的接口往往提供成如下的格式
http://xxxx.com/weixinauthorize?redirect=xxxxxx 其中参数redirect是一个回调地址
我以下面的场景为例来说明问题
先来看调用端的情况,调用的代码应该是怎么写的
假如说
我们需要传入的回调地址是 http://b.com/2.php
但是我们希望在这个地址上另外增加一个回调地址callbackurl,比如说 http://c.com/3.php
如以下的形式
http://b.com/2.php?callbackurl=http://c.com/3.php <---- 这个地址是无法工作的
http://b.com/2.php?callbackurl=urlencode(http://c.com/3.php ) <---- 这个地址是才能工作的
所以我们按照以下2步进行处理后,将值传入redirect
第一步 将callbackurl进行urlencode,形式如下:
第二步,将上面获取到值再进行urlencode,形式如下:
所以最终我们得到的是 http://xxxx.com/weixinauthorize?redirect=urlencode(http://b.com/2.php?callbackurl=urlencode(http://c.com/3.php))
好,现在再来看微信授权服务端的情况,提供weixinauthorize这服务的代码应该怎么写呢
假如说 在程序中有以下的代码
$redirect = urldecode($_GET['redirect']);
那么问题就发生了.
我们本来是想得到的$redirect的值 是http://b.com/2.php?callbackurl=urlencode(http://c.com/3.php) 但最终我们得到的是 http://b.com/2.php?callbackurl=http://c.com/3.php 这个地址. 而这个地址是不工作的.
所以 我们必须要要将上面的代码中urldecode去掉
由于我在工作中发生过这样的错误.特别在这里记录一下.以免遗忘.
以上都是我的一些猜测.但是通过这个理解,也能说明一些问题.所以我认为我的这个猜测是正确的.如果有谁有更好的解释,那么也请告诉我.谢谢