cURL не может получить окончательный URL-адрес

#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 404 Sorry, 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. — возможно, это видео с блокировкой региона? или, возможно, его можно просматривать только для вошедших в систему людей? или что-то в этом роде? idk

2. @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 🙂