Our blog
PHP, cURL, CURLOPT FOLLOWLOCATION and open basedir Or Safe Mode
If you are trying to get a curl script which needs follow on location functionality to run on a server which has either open_basedir or safe mode enabled you will get an error message similar to the following:
CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set
After a bit of digging, some kind soul has put a workaround here
Here is how to use the function
-
function curl($url){
-
$go = curl_init($url);
-
curl_setopt ($go, CURLOPT_URL, $url);
-
//follow on location problems
-
-
-
curl_setopt ($go, CURLOPT_FOLLOWLOCATION, $l);
-
-
$syn = curl_exec($go);
-
-
}else{
-
-
$syn = curl_redir_exec($go);
-
-
}
-
-
curl_close($go);
-
return $syn;
-
}
-
-
//follow on location problems workaround
-
-
function curl_redir_exec($ch)
-
-
{
-
-
-
-
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);
-
-
-
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
-
-
if ($http_code == 301 || $http_code == 302)
-
-
{
-
-
-
-
-
if (!$url)
-
-
{
-
-
//couldn't process the url to redirect to
-
-
$curl_loops = 0;
-
-
return $data;
-
-
}
-
-
-
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);
-
-
return curl_redir_exec($ch);
-
-
} else {
-
-
$curl_loops=0;
-
-
return $data;
-
-
}
-
-
}
More Reading:
8 Comments
|
this is not a working code |
|
oops sorry about that- i have add this in there. |
|
Karl February 5th, 2009 |
Very nice, works like a treat. Am using it with domdocument and xpath to scrape content from various sources. Quick tip: obvious, but for php novices, you'll need to add something like the following to your code to actually start the process $html=curl('http://www.urltobeparsed.com'); See here for more info: http://www.merchantos.com/makebeta/php/scraping-links-with-php/ |
|
Ali February 25th, 2009 |
Hello, I am getting the error CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set What can be the possible solution. I didnt understand the above script you have written |
|
nd May 7th, 2009 |
Nice code! However, I had a problem with it since does not work on all platforms. Correct is Regards, |
|
nice one Andy. I wonder if we could mod the function to work on any platform.. would swapping \n\n for PHP_EOL work? |
|
steve July 29th, 2009 |
nd - you're right about the \n\r this worked for me. also, error in line 6, should be: if (ini_get('open_basedir') == '' && ini_get('safe_mode') == 'Off'){ in my case I also had to change the safe mode check because safe mode off is an empty string: if (ini_get('open_basedir') == '' && ini_get('safe_mode' == '')){ |
|
Andy September 24th, 2009 |
Wonderful, saved my life $new_url = $url['scheme'].'://'.$url['host'].$url['path'].(array_key_exists('query', $url) && $url['query'] ? '?'.$url['query'] : ''); Maybe it´s usefull for someone. Nice greetings and a big thank you for this workaround. Andy |
RSS Feed
sakao
January 18th, 2009