4

我怎样才能在 PHP 中做到这一点?例如

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

在 Java 中,解决方案是这样的:

您应该使用 HttpWebRequest 实例向 url 发出 HEAD 请求。在返回的 HttpWebResponse 中,检查 ResponseUri。

只需确保在 HttpWebRequest 实例上将 AllowAutoRedirect 设置为 true(默认情况下为 true)。(谢谢,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();
}

(谢谢,弗雷德里克·莫克)

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

4

5 回答 5

6

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

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

$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);

一些解释:

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

而且,在这里,你得到:

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

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


这应该适用于任何缩短 URL 服务,独立于其特定 API。

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

于 2009-08-23T21:46:26.267 回答
1
<?php
$url = 'http://www.example.com';

print_r(get_headers($url));

print_r(get_headers($url, 1));
?>
于 2009-08-23T21:38:42.927 回答
1

你读过 bit.ly API 吗?具体在这里

我看不到问题。您是在谈论可能的重定向吗?

于 2009-08-23T21:39:10.290 回答
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"];
于 2009-08-23T21:37:33.040 回答
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;

}
于 2017-06-19T11:56:14.553 回答