Intereting Posts
PHPmailer отправляет почту спама в hotmail. как исправить? PHP Предупреждение: mysql_num_rows () ожидает, что параметр 1 будет ресурсом, boolean given Laravel Pagination с хорошими URL-адресами, чем строка запроса Убить запрос MySQL на прерывание пользователя php подключиться к mysql db в облаке 9? Проблема с php short_open_tag Доступ к значению StdClass с помощью двоеточия: защищенный Предупреждения 'xmlParseEntityRef: no name' при загрузке xml в файл php PHP Script для загрузки исходного кода веб-страницы и поиска определенной строки Сохранение CakePHP не сохраняет ассоциированную модель Предупреждение: PDOStatement :: execute (): SQLSTATE : Недопустимый номер параметра: количество связанных переменных не совпадает с числом токенов в Отобразить последнюю ленту новостей Twitter «дата создана» с использованием tmhOAuth и PHP База данных Laravel 4 migrate не найдена Получение доступа для команды cmd с использованием функции php Поддержка SOAP MTOM / XOP в PHP

Как получить целевой 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); ?> 

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

 echo curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 
 $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'; 

Вы должны захватить заголовок Location для перенаправленного URL.

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

  $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-адрес (поскольку он не был найден). Это можно использовать для обновления или удаления ссылок с вашего сайта. Во всяком случае, это была моя потребность.

Новый пункт назначения для перенаправления 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 является лишь временным перенаправлением.

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

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

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

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

Вот способ получить все заголовки, возвращенные с помощью запроса на завивку 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); } 

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