2009-08-23 3 views
4

Как это сделать в PHP? напримерОпределить конечное назначение сокращенного URL-адреса в 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(); 
} 

(Thx, Фредрик Mork)

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

+0

Вам это нужно для конкретного укороченного? или вы просто говорите вообще? многие из «хороших» сокращений могут предоставить вам конечный пункт назначения при вызове через API –

+1

FYI: Если вы пытаетесь перенаправить URL-адреса URL http://t.co twitter, они дают код ответа 200, поэтому вам нужно захватить ' 'от тела. – Philip

ответ

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"]; 
1
<?php 
$url = 'http://www.example.com'; 

print_r(get_headers($url)); 

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

Анализ заголовка местоположения, вероятно, будет работать; но что, если есть буксировка (или более) уровней перенаправления? (да, не то, что вы обычно видите, но что, если целевой сайт устанавливает некоторые переадресации в день выпуска новой версии сайта?) –

1

Вы читали bit.ly API? в частности here?

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

+0

Если вы используете определенный API, вам нужно будет создать новый конкретный код для каждого отдельного услуга сокращения URL-адресов; учитывая, что их совсем немного, вы никогда не прекратите кодирование и тестирование ... некоторые «общие» решения, которые работают с любой услугой, вероятно, будут проще, по крайней мере, в качестве долгосрочного решения ... –

+0

правильно! вот почему я спрашивал: P –

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

Некоторые пояснения:

  • запрашиваемый URL является короткий один
  • вы не хотите, заголовки
  • Вы хотите, чтобы тело не отображалось - возможно, бесполезно
  • вам не нужно тело; то есть, вы хотите запрос главою, а не GET
  • вы хотите места, чтобы следовать, конечно
  • когда запрос был выполнен, вы хотите, чтобы получить «реальный» URL, который был неправдоподобным

И, вот, вы получите:

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

(Поставляется с одной из последних твитов я увидел, что содержал короткий URL)


Это должно работать с любой услугой сокращения URL-адресов независимо от их конкретного API.

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

+0

Я пробовал несколько вещей на t.co twitter links, и это единственное, что сработало для меня до сих пор. Благодаря! +1 –

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; 

}