Подтвердить что ты не робот

Как получить целевой URL с помощью cURL?

Как получить целевой URL-адрес с помощью cURL, когда код состояния HTTP равен 302?

<?PHP
$url = "http://www.ecs.soton.ac.uk/news/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
$status_code = curl_getinfo($ch,CURLINFO_HTTP_CODE);

if($status_code=302 or $status_code=301){
  $url = "";
  // I want to to get the destination url
}
curl_close($ch);
?>
4b9b3361

Ответ 1

Вы можете использовать:

echo curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

Ответ 2

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE); // We'll parse redirect url from header.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE); // We want to just get redirect url but not to follow it.
$response = curl_exec($ch);
preg_match_all('/^Location:(.*)$/mi', $response, $matches);
curl_close($ch);
echo !empty($matches[1]) ? trim($matches[1][0]) : 'No redirect found';

Ответ 3

Вам нужно захватить заголовок Местоположение для перенаправленного URL.

Ответ 4

Немного от ответа, но хотел показать полный рабочий пример, некоторые из решений там есть:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url); //set url
    curl_setopt($ch, CURLOPT_HEADER, true); //get header
    curl_setopt($ch, CURLOPT_NOBODY, true); //do not include response body
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //do not show in browser the response
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //follow any redirects
    curl_exec($ch);
    $new_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); //extract the url from the header response
    curl_close($ch);

Это работает с любыми переадресациями, такими как 301 или 302, однако на 404 он просто вернет исходный URL-адрес (поскольку он не был найден). Это можно использовать для обновления или удаления ссылок с вашего сайта. Во всяком случае, это была моя потребность.

Ответ 5

Новый пункт назначения для перенаправления 302 ist расположен в поле http-заголовка "location". Пример:

HTTP/1.1 302 Found
Date: Tue, 30 Jun 2002 1:20:30 GMT
Server: Apache
Location: http://www.foobar.com/foo/bar
Content-Type: text/html; charset=iso-8859-1

Просто grep с помощью регулярного выражения.

Чтобы включить всю информацию заголовка HTTP, включите ее в результат с параметром curl CURLOPT_HEADER. Установите его с помощью:

curl_setopt($c, CURLOPT_HEADER, true);

Если вы просто хотите, чтобы завиток выполнял перенаправление, используйте CURLOPT_FOLLOWLOCATION:

curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);

Во всяком случае, вы не должны использовать новый URI, потому что HTTP Statuscode 302 - это только временное перенаправление.

Ответ 6

В ответ на комментарий пользователя437797 о Тамике Созиеве (я, к сожалению, не имею репутации, чтобы прокомментировать там напрямую):

CURLINFO_EFFECTIVE_URL отлично работает, но для этого, поскольку op хочет, вам также нужно установить CURLOPT_FOLLOWLOCATION в TRUE, конечно. Это потому, что CURLINFO_EFFECTIVE_URL возвращает именно то, что он говорит, эффективный URL-адрес, который заканчивается загрузкой. Если вы не будете следовать переадресации, это будет ваш запрошенный URL-адрес, если вы будете следовать переадресации, то это будет окончательный URL-адрес, на который перенаправляется.

Хорошая вещь в этом подходе заключается в том, что он также работает с несколькими переадресациями, тогда как при извлечении и анализе заголовка HTTP вы, возможно, придется сделать это несколько раз до того, как откроется окончательный URL-адрес назначения.

Также обратите внимание, что максимальное количество переадресаций, зависящих от курсора, можно контролировать с помощью CURLOPT_MAXREDIRS. По умолчанию он неограничен (-1), но это может вызвать у вас проблемы, если кто-то (возможно, намеренно) настроен и бесконечный цикл перенаправления для некоторого URL-адреса.

Ответ 7

Здесь вы можете получить все заголовки, возвращенные с помощью запроса curl http, а также код состояния и массив строк заголовка для каждого заголовка.

$url = 'http://google.com';
$opts = array(CURLOPT_URL => $url,
              CURLOPT_RETURNTRANSFER => true,
              CURLOPT_HEADER => true,
              CURLOPT_FOLLOWLOCATION => true);

$ch = curl_init();
curl_setopt_array($ch, $opts);
$return = curl_exec($ch);
curl_close($ch);

$headers = http_response_headers($return);
foreach ($headers as $header) {
    $str = http_response_code($header);
    $hdr_arr = http_response_header_lines($header);
    if (isset($hdr_arr['Location'])) {
        $str .= ' - Location: ' . $hdr_arr['Location'];
    }
    echo $str . '<br />';
}

function http_response_headers($ret_str)
{
    $hdrs = array();
    $arr = explode("\r\n\r\n", $ret_str);
    foreach ($arr as $each) {
        if (substr($each, 0, 4) == 'HTTP') {
            $hdrs[] = $each;
        }
    }
    return $hdrs;
}

function http_response_header_lines($hdr_str)
{
    $lines = explode("\n", $hdr_str);
    $hdr_arr['status_line'] = trim(array_shift($lines));
    foreach ($lines as $line) {
        list($key, $val) = explode(':', $line, 2);
        $hdr_arr[trim($key)] = trim($val);
    }
    return $hdr_arr;
}

function http_response_code($str)
{
    return substr(trim(strstr($str, ' ')), 0, 3);
}

Ответ 8

Используйте curl_getinfo($ch), и первый элемент (url) будет указывать эффективный URL.