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
if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')){
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)
{
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("\n\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);
return curl_redir_exec($ch);
} else {
$curl_loops=0;
return $data;
}
}

this is not a working code
as far as i can see
there’s no
$go = curl_init($url);
in the first line
oops sorry about that- i have add this in there.
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/
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
Nice code!
However, I had a problem with it since
explode(“\n\n”, $data, 2);
does not work on all platforms. Correct is
explode(“\n\r”, $data, 2);
Regards,
Andy
nice one Andy.
I wonder if we could mod the function to work on any platform..
would swapping \n\n for PHP_EOL work?
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’ == ”)){
Wonderful, saved my life
I used it on an connector which i wrote for plugging WordPress and CakePHP together. In this constellation, there was no $url["query"] and i got an error message. So this is my solution for that:
$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
sdf
Yes this is working on my site.
Thanks for solution
What do you called the script before uploading it to the server
Great job thanks. You helped me to fix this very annoying problem. Thanks very much.
You are a god!
Took me 2 hours of configuring but now it works! Thanks alot!
thanks! worked like a charm
This saved me A LOT of time. Thank you!
Awesome script. Really helped me!
Thanks,
Karthik
Error on Line 94 – Notice: Undefined offset: 1:
list($header, $data) = explode(“\n\n”, $data, 2);
list($header, $data) = explode(“\n\n”, $data, 2);
$header == ??
Sand, $header is the first element of the $data array, but you may need to change “\n\n” to something which works on your system. See earlier comments.
i have a website using wp.
when i want to install the plugin, i got the alert
Warning: curl_setopt_array() [function.curl-setopt-array]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/greendi4/public_html/kindle/wp-content/plugins/instant_traffic_robot/includes/classes/plugin.class.php on line 847
can you help me with this problem??
Hi @ all,
i’m using the script on both windows an linux platforms.
Therefore the lines that explodes the header have to be changed.
Insteaf of:
$data = curl_exec($ch);
list($header, $data) = explode(“\n\n”, $data, 2);
use this:
$data1 = curl_exec($ch);
//Linux
list($header, $data) = explode(“\n\n”, $data1, 2);
if($data==null) {
//Windows-System
list($header, $data) = explode(“\n\r”, $data1, 2);
}
Best regards
Andreas
curl_setopt ($go, CURLOPT_FOLLOWLOCATION, $l);
What is the $l?
I just wanna say thanks to the author and all the contributors via comments! This code worked like a charm for me!
Cheers:-)
To Tony Huang: The $l you can just delete and enter ’1′ instead. This means that if safe mode is not set, curl will make use of the CURLOPT_FOLLOWLOCATION. Anyhow, if CURLOPT_FOLLOWLOCATION seems to work for you, you are in no need of this script..
Thanks, may i can use you code to fix my problem as you mention.
This post helped another one with the safe_mode/open_basedir problem and I am posting this comment to say thank you, finally my problem is solved.
This saved me A LOT of time. Thank you!
Hi,
I am a complete newbie here so sorry in advance;
I am getting the error;
=======================
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/inkingst/public_html/install.php on line 25
[2012-04-05 16:01:17] Unable to login to cpanel
=======================
On line 25 of install.php it says;
=======================
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
=======================
Where should I put the workaround code? Again I am sorry but I don’t have a clue
Thanks in advance.
Bob.
Hi, Nice work – but I god this problem at my WP-blog – can You help?
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /var/www/danish-artinfo.dk/public_html/wp-content/plugins/wp-portfolio/lib/
thumbnailer.inc.php on line 552
Regards Jesper
Hi,
Please anyone?
Need som newbie help
Hi,
Yes, my problem has been solved with this code.
Hi, this seems to be the solution to my problem but I’m not sure. I’m getting the following errors and would like to know if the code above would be a solution for me. If so, please tell me what or how I have to upload it to the server. Thank you so much…