以下重定向网址变为http%3A%2F%2F而不是http://。我怎么能避免这个?
提前致谢。
$params = array(
'client_id' => $client_id,
'redirect_uri' => site_url('welcome/google_connect_redirect/'),
'state' => $_SESSION['state'],
'approval_prompt' => 'force',
'scope' => 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email',
'response_type' => 'code'
);
$url = "https://accounts.google.com/o/oauth2/auth?".http_build_query($params);
// send to google
redirect($url);
网址就像这样。
https://accounts.google.com/o/oauth2/auth?client_id=871111192098.apps.
googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8888%2Fmyappname
%2Findex.php%2Fwelcome%2Fgoogle_connect_redirect&state=f0babsomeletterscb5b48753358c
3b9&approval_prompt=force&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2F
userinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&
response_type=code
答案 0 :(得分:3)
当您将带有特殊字符的字符串放入网址时,它们会被编码,您可以使用urldecode
答案 1 :(得分:1)
http_build_query()
的要点是,在以querystring格式加入它们之前,它是urlencode()
每个数组的值。这是首选行为。
答案 2 :(得分:1)
查询字符串已编码,因为某些特殊字符在URL中具有特殊含义。
来自Wikipedia:
某些字符不能是网址的一部分(例如,空格)和 其他一些字符在URL中具有特殊含义:例如, 字符#可用于进一步指定子节(或 片段); character =用于分隔名称 从一个价值。可能需要转换查询字符串以满足这些要求 限制。这可以使用称为URL编码的模式来完成。
答案 3 :(得分:0)
这实际上是期望的行为以及正确的操作方式。
请查看功能手册http_build_query
从提供的关联(或索引)数组中生成URL编码的查询字符串。
因此,基本上,它的作用是遍历整个数组并对其进行urlencode(这就是为什么您看到这些字符),然后将其与&联接在一起。如果您想避免这种情况,请不要使用http_build_query(),但我真的不建议这样做。