Определить конечное назначение сокращенного URL в PHP? - PullRequest
4 голосов
/ 24 августа 2009

Как я могу сделать это на PHP? например,

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

В Java решение таково:

Вы должны отправить запрос HEAD на URL с помощью HttpWebRequest пример. В возвращенном HttpWebResponse, проверьте ResponseUri.

Просто убедитесь, что AllowAutoRedirect установлен на true в HttpWebRequest экземпляр (это верно по умолчанию). (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();
}

(спасибо, Фредрик Морк)

Но я хочу сделать это на PHP. КАК? :)

Ответы [ 5 ]

5 голосов
/ 24 августа 2009

Время попробовать, вы уже нашли ответ.

Тем не менее, я бы пошел с чем-то вроде этого:

$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.

Вы также можете настроить некоторые другие параметры, такие как тайм-ауты; см. curl_setopt для получения дополнительной информации.

1 голос
/ 24 августа 2009
<?php
$url = 'http://www.example.com';

print_r(get_headers($url));

print_r(get_headers($url, 1));
?>
1 голос
/ 24 августа 2009

Вы читали API bit.ly? в частности здесь ?

Я не вижу проблемы. Вы говорите о возможных переадресациях?

0 голосов
/ 19 июня 2017

Вот мое решение. Я закодировал это, потому что ничего из вышеперечисленного не работало правильно.

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;

}
0 голосов
/ 24 августа 2009

КРЕДИТ ИДЕТ К 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"];
...