Если при работе с библиотекой 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 указанному в заголовке, если он отсутствует — отдает полученное содержимое.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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; } } |