Определить конечное назначение сокращенного URL в PHP?
Как я могу сделать это в PHP? например
bit.ly/f00b4r ==> http://www.google.com/search?q=cute+kittens
В Java решение таково:
Вы должны отправить HEAD-запрос к URL-адресу, используя экземпляр HttpWebRequest. В возвращенном HttpWebResponse проверьте ResponseUri.
Просто убедитесь, что для параметра AllowAutoRedirect установлено значение true в экземпляре HttpWebRequest (по умолчанию это значение true). (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 ответов
КРЕДИТ ИДЕТ НА 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"];
Время попробовать, вы уже нашли ответ.
Тем не менее, я бы пошел с чем-то вроде этого:
$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.
Вы также можете настроить некоторые другие параметры, например тайм-ауты; см. http://php.net/curl_setopt для получения дополнительной информации.
Вы читали API bit.ly? конкретно здесь?
Я не вижу проблемы. Вы говорите о возможных переадресациях?
<?php
$url = 'http://www.example.com';
print_r(get_headers($url));
print_r(get_headers($url, 1));
?>
Вот мое решение. Я закодировал это, потому что ничего из вышеперечисленного не работало правильно.
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;
}