Как я могу это сделать в PHP? например
bit.ly/f00b4r ==> http://www.google.com/search?q=cute+kittens
В Java решение таково:
Вы должны отправить запрос HEAD на url, используя экземпляр HttpWebRequest. В возвращаемом HttpWebResponse проверьте ResponseUri.
- Маршрутизация URL-адресов PHP-приложений
- Проблема маршрутизации с Slim framework
- Codeigniter: отправлять все запросы, не соответствующие имени контроллера, контроллеру по умолчанию
- Йомен против UrlRouting
- Как я могу скрыть user_id из URL-адреса с помощью схемы yii?
Просто убедитесь, что для параметра 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);
Некоторые объяснения:
И здесь вы получаете:
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; }