通过GET将参数以通用方式传递给任何URL

时间:2011-05-24 06:39:42

标签: php get

我从外面给了我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忽略其格式的通用方法是什么?

5 个答案:

答案 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;
}  

看起来它对我来说很完美。谢谢大家。

相关问题