我从外面给了我back_url
。我需要生成一个哈希并使用此参数back_url
重定向到此header("Location: $back_url?hash=123sdf")
。但问题是我不知道back_url
的格式。
www.example.com
而我header("Location: $back_url/?hash=123sdf")
sj没关系。www.example.com/?param=value
,如果我执行eader("Location: $back_url/?hash=123sdf")
则错误,因为它会www.example.com/?param=value/?hash=123asd
。等等。问题是:将params传递给back_url
忽略其格式的通用方法是什么?
答案 0 :(得分:5)
复杂但非常干净的方式是
parse_url()
将查询字符串(如果有)从URL提取到数组hash
添加到结果数组中:$params["hash"] = "1234";
http_build_query()
将参数粘贴回查询字符串parse_url()
返回的所有组件并将其粘贴回完整的网址有一点需要注意的是,这会将URL解析为组件并将其粘合在一起,因此它可能不适用于首先被破坏的URL。
答案 1 :(得分:1)
答案 2 :(得分:1)
如果您有PECL HTTP扩展,请使用http_build_url:
$url = '...';
$hash = '...';
$new_url = http_build_url($url, array('hash' => $hash), HTTP_URL_JOIN_QUERY);
如果您没有http_build_url,可以使用parse_url查找网址中的不同部分。然后,这只是将它们粘贴在一起的问题。 Here's手册中的解决方案,可根据您的需求量身定制。
答案 3 :(得分:0)
好吧,您需要检测$back_url
是否有其他查询参数(或GET变量),如果没有,请使用?hash=123asd
附加哈希,或者如果确实使用&hash=123asd
则附加哈希它有查询参数。
如果您知道$back_url
是一个完整的网址,例如http://whatever.com/blah/blah(重要部分是http://whatever.com
,则可以使用parse_url
获取所有组件,然后继续Pekka的回答。如果你的$back_url
不是以http://...
开头,那么请添加正确的值(我假设为http://$_SERVER['host']
,然后继续Pekka的回答。
答案 4 :(得分:0)
写了这个函数:
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;
}
看起来它对我来说很完美。谢谢大家。