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:
22 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 |
|
test July 14th, 2010 |
sdf |
|
Yes this is working on my site. Thanks for solution |
|
tim August 22nd, 2010 |
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. |
|
Ron June 4th, 2011 |
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! |
|
Karthik August 17th, 2011 |
Awesome script. Really helped me! Thanks, |
|
Sand August 22nd, 2011 |
Error on Line 94 - Notice: Undefined offset: 1: |
|
Sand August 22nd, 2011 |
list($header, $data) = explode("\n\n", $data, 2); $header == ?? |
|
Andrew August 26th, 2011 |
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. |
|
wawan September 13th, 2011 |
i have a website using wp. 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. Insteaf of: use this: Best regards Andreas |
|
Tony Huang November 3rd, 2011 |
curl_setopt ($go, CURLOPT_FOLLOWLOCATION, $l); What is the $l? |
RSS Feed
sakao
January 18th, 2009