Php 通过GET以通用方式向任意url传递参数
我有从外面给我的Php 通过GET以通用方式向任意url传递参数,php,get,Php,Get,我有从外面给我的back\u url。我需要生成一个散列,并使用以下参数重定向到此back\u url,标题(“Location:$back\u url?hash=123sdf”)。但问题是我不知道back\u url的格式 它可能是www.example.com,我有标题(“位置:$back\u url/?hash=123sdf”)sj没关系 它可能www.example.com/?param=value如果我使用header(“Location:$back\u url/?hash=123s
back\u url
。我需要生成一个散列,并使用以下参数重定向到此back\u url
,标题(“Location:$back\u url?hash=123sdf”)
。但问题是我不知道back\u url
的格式
- 它可能是
,我有www.example.com
sj没关系标题(“位置:$back\u url/?hash=123sdf”)
- 它可能
如果我使用hwww.example.com/?param=value
它是错误的,因为它将是eader(“Location:$back\u url/?hash=123sdf”)
www.example.com/?param=value/?hash=123asd
等等。问题是:将参数传递到
back\u url
忽略其格式的通用方法是什么?您尝试过使用吗?您尝试过使用吗?一种复杂但非常干净的方法是
- 用于将查询字符串(如果有)从URL提取到数组中
- 将
添加到结果数组中:hash
$params[“hash”]=“1234”代码>
- 用于将参数粘回到查询字符串中
- 获取
返回的所有组件,并将它们粘合回完整的urlparse_url()
需要注意的一点是,这会将URL分解为it组件并将其粘在一起,因此可能无法处理一开始就被破坏的URL。一种复杂但非常干净的方法是
- 用于将查询字符串(如果有)从URL提取到数组中
- 将
添加到结果数组中:hash
$params[“hash”]=“1234”代码>
- 用于将参数粘回到查询字符串中
- 获取
返回的所有组件,并将它们粘合回完整的urlparse_url()
需要注意的一点是,这会将URL分解为it组件并将其粘在一起,因此可能无法处理一开始就被破坏的URL。如果您有PECL HTTP扩展,请使用:
如果没有http_build_url,可以使用查找url的不同部分。那就是把它们粘在一起的问题了。手册中的解决方案可根据您的需要进行定制。如果您有PECL HTTP扩展,请使用:
如果没有http_build_url,可以使用查找url的不同部分。那就是把它们粘在一起的问题了。手册中的解决方案可以根据您的需要进行定制。嗯,您需要检测
$back\u url
是否有其他查询参数(或获取变量),如果没有,则使用?hash=123asd
附加哈希,如果确实有查询参数,则使用&hash=123asd
如果您知道
$back\u url
是一个完整的url,就像(重要的部分是http://whatever.com
,您可以使用获取所有组件,然后继续使用Pekka的答案。如果您的$back\u url
不是以http://...
,然后在前面加上正确的值(我假设http://$\u SERVER['host']
再次,继续Pekka的回答。好吧,您需要检测$back\u url
是否有其他查询参数(或获取变量),如果没有,则使用?hash=123asd
附加您的哈希,如果确实有查询参数,则使用&hash=123asd
如果您知道$back\u url
是一个完整的url,就像(重要的部分是http://whatever.com
,您可以使用获取所有组件,然后继续使用Pekka的答案。如果您的$back\u url
不是以http://...
,然后在前面加上正确的值(我假设http://$\u SERVER['host']
然后再次继续Pekka的回答。编写了以下函数:
private function addUrlParam(array $params, $url){
$parsed = parse_url($url);
if(!isset($parsed['query']))
{
$slash = '';
if(substr($url, -1) !== '/')
$slash = '/';
$start_with = $slash.'?';
}
else
$start_with = '&';
$scheme = '';
if(!isset($parsed['scheme']))
$scheme = 'http://';
$query = http_build_query($params);
return $scheme.$url.$start_with.$query;
}
看起来它非常适合我。谢谢大家。编写了以下函数:
private function addUrlParam(array $params, $url){
$parsed = parse_url($url);
if(!isset($parsed['query']))
{
$slash = '';
if(substr($url, -1) !== '/')
$slash = '/';
$start_with = $slash.'?';
}
else
$start_with = '&';
$scheme = '';
if(!isset($parsed['scheme']))
$scheme = 'http://';
$query = http_build_query($params);
return $scheme.$url.$start_with.$query;
}
看起来很适合我。谢谢大家。如果安装了PECL HTTP扩展,这是首选方法,否则HTTP\U build\u查询不可用。我认为它与HTTP\U build\u url具有相同的依赖性。你是对的。如果安装了PECL HTTP扩展,这是首选方法,否则HTTP\U build\u查询不可用。我我认为它与http_build_url具有相同的依赖性。你是正确的。谢谢大家。我使用了你的评论并编写了适合我的小函数。我使用了你的评论并编写了适合我的小函数