首先,项目使用的是pathinfo模式的网址,比如:http://www.xxx.com/Index/ucenter/变量名/变量值网址,这时候直接把网址放到变量值里是不可行的,第一个想法是将它urlencode编码以后传递。
通过php代码 $_SERVER['REQUEST_URI'] 取到的地址为/index.php?con=index&act=ucenter
结果编码以后的地址变成了 %2findex.php%3fcon%3dindex%26act%3ducenter,拼接后的跳转地址为:http://www.xxx.com/Index/ucenter/变量名/%2findex.php%3fcon%3dindex%26act%3ducenter
当直接访问的时候,因为碰到了参数值中的.php,服务器认为你是在访问%2findex.php这个文件,却又找不到,因此报not find file错误。
解决方法:
//把地址中的“.php”自定义编码加密一下,要不然直接作为get参数碰到xxx.php就会报找不到文件的错误,从而不能正常传值
$statestr = str_replace(".php","ASCII16ASCII112ASCII104ASCII112",$state);
继续执行,当我在微信中登录完成,最后一步需要跳转时,将上一步替换掉的.php再替换回来,再执行urldecode解码,然后用作跳转,这时出现白屏,查看网址后,网址为:http://www.xxx.com/%2findex.php%3fcon%3dindex%26act%3ducenter
看到这个网址我就很奇怪,我明明把传递过来的路径已经urldecode解码了,为什么还是URL编码状态呢?,怎么检查都是清晰的思路:传递前编码-》替换.php-》传递中-》传递后替换回.php-》传递后解码-》跳转。传递前后一一对应,貌似没什么不对。来回检查了一遍,怀疑是在传递过程中,微信对我传递的这个URL编码过的参数又进行了一次URL编码,也就是说,如果我想要得到最终的真实结果,需要解码两次。
综上所述我最终的解决思路是:
传递前编码-》替换.php-》传递中-》传递后替换回.php-》传递后解码-》传递后解码后再次解码-》跳转
注:替换.php是为了解决not find file错误,
两次解码是为了解决跳转后网址错误白屏的问题。