CURL - если сервер отдает редирект

CURL - если сервер отдает редирект

Бывает так что сервер перенаправляет на другой URL. Например Google, если перейти на https://google.com c IP из РФ он делает 302-й редирект на https://www.google.ru.

Чтобы CURL сам переходил на новый URL, нужно добавить параметр:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
PHP

Но если он не помогает, то можно применить функцию:

function curl_redir_exec($ch)
{
	static $curl_loops = 0;
	static $curl_max_loops = 20;
	if ($curl_loops >= $curl_max_loops) {
		$curl_loops = 0;
		return false;
	}

	curl_setopt($ch, CURLOPT_HEADER, true);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	$data = curl_exec($ch);
	$dd = explode("\r\n\r\n", $data); // или $dd = explode("\r\n", $data);
	$header = $dd[0];
	$data = @$dd[1];
	
	$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  
	if ($http_code == 301 || $http_code == 302) {
		$matches = array();
		preg_match('/Location:(.*?)\n/', $header, $matches);
		$url = @parse_url(trim(array_pop($matches)));
		if (!$url) {
			$curl_loops = 0;
			return $data;
		}
		
		$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
		if (empty($url['scheme'])) {
			$url['scheme'] = $last_url['scheme'];
		}
		if (empty($url['host'])) {
			$url['host'] = $last_url['host'];
		}
		if (empty($url['path'])) {
			$url['path'] = $last_url['path'];
		}

		$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query'] ? '?' . $url['query'] : '');
		curl_setopt($ch, CURLOPT_URL, $new_url);
		return curl_redir_exec($ch);
	} else {
		$curl_loops = 0;
		return $data;
	}
}
	
	
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://google.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_redir_exec($ch);
curl_close($ch);

echo $html;
PHP
16.11.2017, обновлено 26.11.2019
14181

Комментарии

, чтобы добавить комментарий.

Другие публикации

Подключение к платежной системе Сбербанка
После регистрации в системе эквайринга Сбербанка и получив доступ к тестовой среде, можно приступить к интеграции с...
66449
+24
PHP транслит
PHP функции для перевода текста, ЧПУ, ссылок и имен файлов в транслит.
39637
+10
Автоматическое сжатие и оптимизация картинок на сайте
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
28155
+8
Бот Телеграм на PHP
Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.
140392
+44
Интеграция с платежной системой PayKeeper в PHP
Платежная платформа PayKeeper позволяет принимать оплату заказов по ссылке, используя данный метод можно с легкостью...
9413
+1
Метрика API
API Яндекс метрики позволяет получить информацию о посещаемости сайта и формировать отчеты, но с ограничением в 30 запросов в секунду и 5000 в сутки.
17221
+6