代码之家  ›  专栏  ›  技术社区  ›  Cameron

在PHP中删除查询字符串(有时基于referer)

php
  •  27
  • Cameron  · 技术社区  · 14 年前

    嗨,在Facebook上,主页链接上有一个查询字符串,如下所示: facebook.com/?ref=home 单击链接并导航到主页时,查询将自动删除。但是,如果要手动键入该链接,则查询是 不是 远离的。知道他们是怎么做到的吗?

    11 回复  |  直到 12 年前
        1
  •  83
  •   netcoder    14 年前

    PHP中最简单的方法:

    $url = preg_replace('/\?.*/', '', $url);
    

    Facebook所做的可能是一个JavaScript,以这种方式:

    if (location.href.match(/\?.*/) && document.referrer) {
       location.href = location.href.replace(/\?.*/, '');
    }
    
        2
  •  33
  •   haz    8 年前

    $url = strtok($url, '?');

    这是你想要的答案,如果你想赢得代码高尔夫。它有。。。

    • 最少的字符
    • 最少的函数调用
    • 一个合理的URL,不管是否有查询字符串
        3
  •  20
  •   leepowers    14 年前

    使用 parse_url

    $link = 'http://facebook.com/page.php?ref=home';
    if ($url = parse_url($link)) {
     printf('%s://%s%s', $url['scheme'], $url['host'], $url['path']);
    }
    
        4
  •  13
  •   highvolt    10 年前

    不使用正则表达式或实际使用 parse_url ,也允许不带查询字符串的URL:

    $url = reset((explode('?', $url)));
    
        5
  •  4
  •   Jan Thomä    14 年前

    $refer=$_SERVER["HTTP_REFERER"];
    
    if ($refer == "facebook.com") {
      // this request was done by clicking a link on facebook
     .. remove query string.
    
    }
    else {
      // this request was done by typing the url into the browser
    }
    

    可以使用netcoder建议的方法删除查询字符串。

        6
  •  1
  •   webbiedave    14 年前

    你好像在问两个问题。如何检测页面是通过facebook访问还是从外部位置访问,以及如何从url中删除查询字符串。

    你可以分析推荐人,看看域名是否是facebook。

    $parts = parse_url($_SERVER['HTTP_REFERER']);
    if (preg_match('/(^|.)facebook.com/', $parts['host'])) {
        // remove query string
    }
    

    删除查询字符串最安全的方法是解析url,然后重新生成它。

    $parts = parse_url('http://www.facebook.com/?ref=home');
    $newUrl = $parts['scheme'].'://'.$parts['host'].$parts['path']; // http://www.facebook.com/ 
    
        7
  •  1
  •   KingCrunch    14 年前

    $url = substr($url,0,strpos($url, '?'));
    

    另一个解决方案(如果还想检索查询字符串)

    list($url,$querystring) = array_pad(explode('?', $url, 2), 2, null));
    
        8
  •  1
  •   Vijay Sharma    13 年前

    function removeQueryStringFromURL ( $url )
    {
        $urlparts = parse_url($url);
        if ( $urlparts != FALSE)
        {
           $url = http_build_url("http://user@www.example.com/pub/index.php?a=b#files", 
                                    array( "scheme" =>     $urlparts['scheme'],
                                           "host"   => $urlparts['host'],
                                           "path"   => $urlparts['path']
                                           ));
           return $url;                                
        }
        return $url;
    }
    

    请记住,此代码需要pecl_http扩展才能工作。

        9
  •  1
  •   Álvaro González    10 年前

    PHP/5.4.0及更高版本的快速而肮脏的替代方案:

    $url = explode('?', $url, 2)[0];
    

    Online demo

        10
  •  1
  •   tim    8 年前

    试试这个:

    $url = strtr('scheme://hostpath', parse_url($url));
    
        11
  •  0
  •   kwelsan    10 年前

    试试这个

    $url_with_querystring = 'www.mydomian.com/myurl.html?unwantedthngs';
    $url_data = parse_url($url_with_querystring);
    $url_without_querystring = str_replace('?'.$url_data['query'], '', $url_with_querystring);