kıvırmak takip konum hatası

4 Cevap curl

Ben bu hata mesajını aldım:

Safe_mode veya open_basedir'dan olarak içeri ayarlandığında CURLOPT_FOLLOWLOCATION aktif olamaz

safe_mode benim web hosting kapatılır.

open_basedir "" dir.

Bunu nasıl çözerim?

4 Cevap

Çözüm PHP kodu yönlendirmeyi uygulamaktır.

İşte benim kendi uygulamasıdır. Bu iki bilinen kısıtlamalar vardır:

  1. Bu zorlar CURLOPT_RETURNTRANSFER
  2. Bu CURLOPT_HEADERFUNCTION ile uyumsuz

Kodu:

function curl_exec_follow(/*resource*/ &$ch, /*int*/ $redirects = 20, /*bool*/ $curlopt_header = false) {
    if ((!ini_get('open_basedir') && !ini_get('safe_mode')) || $redirects < 1) {
        curl_setopt($ch, CURLOPT_HEADER, $curlopt_header);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $redirects > 0);
        curl_setopt($ch, CURLOPT_MAXREDIRS, $redirects);
        return curl_exec($ch);
    } else {
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FORBID_REUSE, false);

        do {
            $data = curl_exec($ch);
            if (curl_errno($ch))
                break;
            $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            if ($code != 301 && $code != 302)
                break;
            $header_start = strpos($data, "\r\n")+2;
            $headers = substr($data, $header_start, strpos($data, "\r\n\r\n", $header_start)+2-$header_start);
            if (!preg_match("!\r\n(?:Location|URI): *(.*?) *\r\n!", $headers, $matches))
                break;
            curl_setopt($ch, CURLOPT_URL, $matches[1]);
        } while (--$redirects);
        if (!$redirects)
            trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING);
        if (!$curlopt_header)
            $data = substr($data, strpos($data, "\r\n\r\n")+4);
        return $data;
    }
}

Bu uyarı mesajı basılır tek yer ext / curl / interface.c olduğunu

if ((PG(open_basedir) && *PG(open_basedir)) || PG(safe_mode)) {
  if (Z_LVAL_PP(zvalue) != 0) {
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set");
    RETVAL_FALSE;
    return 1;
  }
}

Eğer varsa-durum görebileceğiniz gibi open_basedir veya safe_mode ya etkin olmalıdır.

Ben bir süre önce benzer bir durumla karşılaştı ve aşağıdaki çözüm bulundu. Eğer bu yönlendirileceksiniz genellikle nerede olduğunu biliyorsanız sizin için işe yarayabilecek.

    function curl($url, $postVars)
{
    $go = curl_init($url);
    curl_setopt ($go, CURLOPT_URL, $url);
    curl_setopt($go, CURLOPT_VERBOSE, 1);

    //follow on location problems
    if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off'))
    {
        curl_setopt ($go, CURLOPT_FOLLOWLOCATION, $l);
        $syn = curl_exec($go);
        if(curl_error($go))
            return false;
    }
    else
        $syn = curl_redir_exec($go, $postVars);
    curl_close($go);
    return $syn;
}

function curl_redir_exec($ch, $postVars)
{
    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, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postVars);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

    $data = curl_exec($ch);
    if(curl_error($ch))
        return false;
    list($header, $data) = explode("\n\r", $data, 2);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    $redirect_page = "[0-9]*.html";
    $base_redirect = "http://example.com/";

    if ($http_code == 301 || $http_code == 302)
    {
        $matches = array();
        $pregs = eregi($redirect_page, $data, $matches);
        $new_url = $base_redirect . $matches[0];
        if (!$new_url)
        {
            //couldn't process the url to redirect to
            $curl_loops = 0;
            return $data;
        }
        curl_setopt($ch, CURLOPT_URL, $new_url);

        return curl_redir_exec($ch, $postVars);
    }
    else
    {
        $curl_loops=0;
        return $data;
    }
}

Gerçek ortamda test edilmiş, ancak curl_exec ile daha fazla şeffaflık (üstbilgi ve returntransfer seçenekleri ile hiçbir sorun) asla.

function curl_exec_follow(/*resource*/ $ch, /*int*/ $maxredirect = 5) {
if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
} else {
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
    $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

    $rch = curl_copy_handle($ch);
    curl_setopt($rch, CURLOPT_HEADER, true);
    curl_setopt($rch, CURLOPT_NOBODY, true);
    curl_setopt($rch, CURLOPT_RETURNTRANSFER, true);
    do {
        curl_setopt($rch, CURLOPT_URL, $newurl);
        $header = curl_exec($rch);
        if (curl_errno($rch)) {
            $code = 0;
        } else {
            $code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
            if ($code == 301 || $code == 302) {
                preg_match('/Location:(.*?)\n/', $header, $matches);
                $newurl = trim(array_pop($matches));
            } else {
                $code = 0;
            }
        }
    } while ($code && $maxredirect--);
    curl_close($rch);
    curl_setopt($ch, CURLOPT_URL, $newurl);
}
return curl_exec($ch);

}