在PHP中确定缩短的URL的最终目的地?

时间:2009-08-23 21:33:23

标签: php url-routing bit.ly

我怎样才能在PHP中执行此操作? e.g。

bit.ly/f00b4r ==> http://www.google.com/search?q=cute+kittens

在Java中,解决方案是:

  

你应该发出一个HEAD请求   使用HttpWebRequest的url   实例。在返回   HttpWebResponse,检查一下   ResponseUri。

     

确保AllowAutoRedirect   在HttpWebRequest上设置为true   instance(默认为true)。   (Thx,casperOne)

代码是

private static string GetRealUrl(string url)
{
    WebRequest request = WebRequest.Create(url);
    request.Method = WebRequestMethods.Http.Head;
    WebResponse response = request.GetResponse();
    return response.ResponseUri.ToString();
}

(Thx,Fredrik Mork)

但我想用PHP做。如何? :)

5 个答案:

答案 0 :(得分:5)

是时候尝试了,你已经找到了答案。

尽管如此,我还是会这样:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://bit.ly/tqdUj");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);

$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

curl_close($ch);

var_dump($url);

一些解释:

  • 请求的网址是短网址
  • 您不需要标题
  • 你想确保身体不显示 - 可能没用
  • 你不想要身体;即,你想要一个HEAD请求,而不是GET
  • 您希望跟踪地点,当然
  • 执行请求后,您希望获取已提取的“真实”网址

而且,在这里,你得到:

string 'http://wordpress.org/extend/plugins/wp-pubsubhubbub/' (length=52)

(来自我看到的包含短网址的最后一条推文之一)


这应该适用于任何缩短URL服务,与其特定的API无关。

您可能还想调整一些其他选项,例如超时;有关更多信息,请参阅curl_setopt

答案 1 :(得分:1)

<?php
$url = 'http://www.example.com';

print_r(get_headers($url));

print_r(get_headers($url, 1));
?>

答案 2 :(得分:1)

您是否阅读过bit.ly API?具体是here

我看不出这个问题。你在谈论可能的重定向吗?

答案 3 :(得分:0)

信用证转到http://forums.devshed.com/php-development-5/curl-get-final-url-after-inital-url-redirects-544144.html

function get_web_page( $url ) 
{ 
    $options = array( 
        CURLOPT_RETURNTRANSFER => true,     // return web page 
        CURLOPT_HEADER         => true,    // return headers 
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects 
        CURLOPT_ENCODING       => "",       // handle all encodings 
        CURLOPT_USERAGENT      => "spider", // who am i 
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect 
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect 
        CURLOPT_TIMEOUT        => 120,      // timeout on response 
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects 
    ); 

    $ch      = curl_init( $url ); 
    curl_setopt_array( $ch, $options ); 
    $content = curl_exec( $ch ); 
    $err     = curl_errno( $ch ); 
    $errmsg  = curl_error( $ch ); 
    $header  = curl_getinfo( $ch ); 
    curl_close( $ch ); 

    //$header['errno']   = $err; 
   // $header['errmsg']  = $errmsg; 
    //$header['content'] = $content; 
    print($header[0]); 
    return $header; 
}  
$thisurl = "http://www.example.com/redirectfrom";
$myUrlInfo = get_web_page( $thisurl ); 
echo $myUrlInfo["url"];

答案 4 :(得分:0)

这是我的解决方案。我对它进行了编码,因为以上都没有正常工作。

function get_final_location($url, $index=null) {

    if (is_array($url)) {
        $headers = $url;
    }
    else {
        $headers = get_headers($url, 1)['Location'];    
        if (count($headers) == 0) {
            return $url;
        }
    }

    if (is_null($index)) {
        $to_check   = end($headers);
        $index      = count($headers) - 1;
    }
    else {
        $to_check = $headers[$index];
    }

    if (!filter_var($to_check, FILTER_VALIDATE_URL) === false) {
        if (count($headers) - 1 > $index) {
            $lp = parse_url($headers[$index], PHP_URL_SCHEME) . "://" . parse_url($headers[$index], PHP_URL_HOST) . $headers[$index+1];
        }
        else {
            $lp = $to_check;
        }
    }
    else {
        $index--;
        $lp = landingpage($headers, $index);
    }

    return $lp;

}