#curl
Вопрос:
Когда вы переходите по URL-адресу: https://vimeo.com/490405479
Вы автоматически перенаправляетесь на https://vimeo.com/490405479/df8f45be38.
Я пытаюсь получить этот перенаправленный URL-адрес с помощью cURL, но, похоже, это не работает.
Есть идеи, как это исправить?
До сих пор это мой код
private function getFinalURL(string $url): string
{
$location = $url;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if (preg_match('~Location: (.*)~i', $result, $match)) {
$location = trim($match[1]);
}
return $location;
}
Комментарии:
1. когда я открываю
https://vimeo.com/490405479
, я просто получаю HTTP 404Sorry, we couldn’t find that page Make sure you’ve typed the URL correctly, or try searching Vimeo. You could also watch one of the videos below instead.
— возможно, это видео с блокировкой региона? или, возможно, его можно просматривать только для вошедших в систему людей? или что-то в этом роде? idk2. @hanshenrik если вы попытаетесь ввести URL-адрес в строку поиска, вы увидите, что он перенаправляет вас на vimeo.com/490405479/df8f45be38 — как мне получить этот новый перенаправленный URL-адрес?
3. беги
curl 'https://vimeo.com/490405479' --dump-header - -s 2>amp;1 | head -1
, что ты получишь?4. @hanshenrik 404 не найден
5. хорошо, откройте stackoverflow.com в
incognito window
(браузерах на базе chrome) илиprivate window
(firefox) затем перейдитеhttps://vimeo.com/490405479
в это окно, какую страницу вы получите?
Ответ №1:
откуда вы знаете, что заголовок местоположения указывает на конечный URL-адрес? что, если a.com говорит Location: b.com
и b.com говорит Location: c.com
и c.com говорит Location: F.com
и только f.com является ли окончательный URL-адрес? чтобы найти окончательный URL-адрес, вы должны следовать перенаправлениям до тех пор, пока перенаправлений больше не будет. вы можете использовать CURLOPT_FOLLOWLOCATION libcurl для отслеживания URL-адресов и использовать CURLINFO_EFFECTIVE_URL для поиска окончательного URL-адреса, например
function final_url(string $url):string{
// TODO: use CURLOPT_WRITEFUNCTION instead of CURLOPT_RETURNTRANSFER
// to minimize RAM usage.
$ch=curl_init();
if(!curl_setopt_array($ch,array(
CURLOPT_URL=>$url,
CURLOPT_FOLLOWLOCATION=>1,
CURLOPT_RETURNTRANSFER=>1
))){
// error detection
}
curl_exec($ch);
$ret = curl_getinfo($ch,CURLINFO_EFFECTIVE_URL);
curl_close($ch);
return $ret;
}
Комментарии:
1. Привет, спасибо за ваш комментарий — к сожалению, этот код возвращает исходный URL: vimeo.com/490405479 🙂