开发者

CURLOPT_FOLLOWLOCATION cannot be activated [duplicate]

开发者 https://www.devze.com 2023-03-25 22:11 出处:网络
This question already has answers here: curl follow location error (6 answers) Closed 10 years ago. 开发者_C百科
This question already has answers here: curl follow location error (6 answers) Closed 10 years ago. 开发者_C百科

So I keep getting this annoying error on multiple servers(its a warning, so I'd ignore it, but I need the function)

Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/xxx/public_html/xxx.php on line 56

How would I go about fixing this via SSH?


Set safe_mode = Off in your php.ini file (it's usually in /etc/ on the server). If that's already off, then look around for the open_basedir stuff in the php.ini file, and change it accordingly.

Basically, the follow location option has been disabled as a security measure, but PHP's built-in security features are usually more annoying than secure. In fact, safe_mode is deprecated in PHP 5.3.


Try this, If a redirect is required and safemode is enabled it will follow the link based on the header (If your grabbing images though this will not work as it adds the header to the return), this is a workaround to your specific problem, I had the same problem when a customer installed one of my script so had to come up with this.. It will also log errors to: curl.error.log.. useful eh

<?php 
function geturl($url) {
    (function_exists('curl_init')) ? '' : die('cURL Must be installed for geturl function to work. Ask your host to enable it or uncomment extension=php_curl.dll in php.ini');

    $curl = curl_init();
    $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[] = "Accept-Language: en-us,en;q=0.5";
    $header[] = "Pragma: ";

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0 Firefox/5.0');
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_REFERER, $url);
    curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
    curl_setopt($curl, CURLOPT_AUTOREFERER, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    //curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); //CURLOPT_FOLLOWLOCATION Disabled...
    curl_setopt($curl, CURLOPT_TIMEOUT, 60);

    $html = curl_exec($curl);

    $status = curl_getinfo($curl);
    curl_close($curl);

    if ($status['http_code'] != 200) {
        if ($status['http_code'] == 301 || $status['http_code'] == 302) {
            list($header) = explode("\r\n\r\n", $html, 2);
            $matches = array();
            preg_match("/(Location:|URI:)[^(\n)]*/", $header, $matches);
            $url = trim(str_replace($matches[1],"",$matches[0]));
            $url_parsed = parse_url($url);
            return isset($url_parsed) ? geturl($url) : '';
        }

        $oline='';
        foreach ($status as $key => $eline) {
            $oline .= '['.$key.']'.$eline.' ';
        }
        $line = $oline." \r\n ".$url."\r\n-----------------\r\n";

        $handle = @fopen('./curl.error.log', 'a');
        fwrite($handle, $line);
        return false;
    }
    return $html;
}


About safe mode and open_basedir option:

http://www.php.net/manual/en/features.safe-mode.php

http://www.php.net/manual/en/ini.core.php#ini.open-basedir


To solve this problem, simply put safe_mode = Off and clear open_base_dir at php.ini file.


Simply, as long as either open_basedir or safe_mode is enabled in the php.ini file, the CURLOPT_FOLLOWLOCATION configuration cannot be used. To change those settings, I can only give general notes:

  1. SSH to the server
  2. cd to the directory (usually /etc/php5 on linux, depends on your distribution or OS) that contains php.ini
  3. sudo to edit (eg, sudo nano php.ini).
  4. edit the lines that specify open_basedir or safe_mode and either turn them off.

Remember to restart your httpd afterwards!

0

精彩评论

暂无评论...
验证码 换一张
取 消