Определить конечное назначение сокращенного URL-адреса в PHP?

Как я могу это сделать в 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, Fredrik Mork)

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

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

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

 $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 для получения дополнительной информации.

 <?php $url = 'http://www.example.com'; print_r(get_headers($url)); print_r(get_headers($url, 1)); ?> 

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

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

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

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

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