Leon1010

Я в Соц.сетях:

Теги:

Ссылки

Эмуляция CURLOPT_FOLLOWLOCATION

Если при работе с библиотекой cURL, вы получаете ошибку «CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in». Это означает, что для использования опции CURLOPT_FOLLOWLOCATION необходимо выключить safe_mode или деактивировать директиву open_basedir. Часто хостинг-компании не позволяют сделать ни того ни другого.
Опция CURLOPT_FOLLOWLOCATION необходима для того, чтобы, при получении заголовка Location происходило автоматическое перенаправление на указанный URL (301-й, 302-й редирект).

Для решения этой проблемы воспользуйтесь следующей функцией вместо curl_exec.
Функция curl_redir_exec проверяет в возвращаемых заголовках заголовок Location, если он присутствует, то пытается перейти по url указанному в заголовке, если он отсутствует — отдает полученное содержимое.

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);  
	list($header, $data) = explode("\r\n\r\n", $data, 2);  
	$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){  
			//couldn't process the url to redirect to  
			$curl_loops = 0;  
			return $data;  
		}
		$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));  
		if (!$url['scheme'])  
			$url['scheme'] = $last_url['scheme'];  
		if (!$url['host'])  
			$url['host'] = $last_url['host'];  
		if (!$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);  
		//debug('Redirecting to', $new_url);  
		return curl_redir_exec($ch);  
	}else{  
		$curl_loops=0;  
		return $data;  
	}
}

 

 

Запись опубликована в рубрике Кодинг с метками , .