2012-05-31 45 views
3

設置當運行該腳本(http://bizonbytes.com/miscellaneous/sharrre.php?url=https://bizonbytes.com &類型= GOOGLEPLUS ):CURLOPT_FOLLOWLOCATION不能當啓用safe_mode設置或激活了open_basedir在

<?php 
    //Sharrre by Julien Hany 
    $json = array('url'=>'','count'=>0); 
    $json['url'] = $_GET['url']; 
    $url = urlencode($_GET['url']); 
    $type = urlencode($_GET['type']); 

    if(filter_var($_GET['url'], FILTER_VALIDATE_URL)){ 
    if($type == 'googlePlus'){ //source http://www.helmutgranda.com/2011/11/01/get-a-url-google-count-via-php/ 
     $content = parse("https://plusone.google.com/u/0/_/+1/fastbutton?url=".$url."&count=true"); 

     $dom = new DOMDocument; 
     $dom->preserveWhiteSpace = false; 
     @$dom->loadHTML($content); 
     $domxpath = new DOMXPath($dom); 
     $newDom = new DOMDocument; 
     $newDom->formatOutput = true; 

     $filtered = $domxpath->query("//div[@id='aggregateCount']"); 
     $json['count'] = str_replace('>', '', $filtered->item(0)->nodeValue); 
    } 
    else if($type == 'stumbleupon'){ 
     $content = parse("http://www.stumbleupon.com/services/1.01/badge.getinfo?url=$url"); 

     $result = json_decode($content); 
     $json['count'] = $result->result->views; 
     if(!isset($json['count'])) $json['count'] = 0; 
    } 
    else if($type == 'pinterest'){ 
     $content = parse("http://api.pinterest.com/v1/urls/count.json?callback=&url=$url"); 

     $result = json_decode(str_replace(array('(', ')'), array('', ''), $content)); 
     $json['count'] = $result->count; 
     if(!isset($json['count'])) $json['count'] = 0; 
    } 
    } 
    echo str_replace('\\/','/',json_encode($json)); 

    function parse($encUrl){ 
    $options = array(
     CURLOPT_RETURNTRANSFER => true, // return web page 
     CURLOPT_HEADER => false, // don't return headers 
     CURLOPT_FOLLOWLOCATION => true, // follow redirects 
     CURLOPT_ENCODING => "", // handle all encodings 
     CURLOPT_USERAGENT => 'sharrre', // who am i 
     CURLOPT_AUTOREFERER => true, // set referer on redirect 
     CURLOPT_CONNECTTIMEOUT => 5, // timeout on connect 
     CURLOPT_TIMEOUT => 10, // timeout on response 
     CURLOPT_MAXREDIRS => 3, // stop after 10 redirects 
     CURLOPT_SSL_VERIFYHOST => 0, 
     CURLOPT_SSL_VERIFYPEER => false, 
    ); 
    $ch = curl_init(); 

    $options[CURLOPT_URL] = $encUrl; 
    curl_setopt_array($ch, $options); 

    $content = curl_exec($ch); 
    $err = curl_errno($ch); 
    $errmsg = curl_error($ch); 

    curl_close($ch); 

    if ($errmsg != '' || $err != '') { 
     /*print_r($errmsg); 
     print_r($errmsg);*/ 
    } 
    return $content; 
    } 
?> 

我得到以下錯誤:

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 C:\Inetpub\vhosts\bizonbytes.com\httpdocs\miscellaneous\sharrre.php on line 56 
{"url":"https://bizonbytes.com","count":""} 

重要事項

  • 我有PHP沒有經驗。我只需要運行該腳本 (sharrre.php)
  • 我已經看看其他類似的情況,但可以找出問題。
  • 我打開窗戶/ php.ini並確信safe_mode設置=關
  • 我注意的open_basedir設置是這樣;的open_basedir =
  • 我需要在添加的open_basedir的東西?
  • 這是關於安裝的PHP版本的詳細信息的鏈接。見http://bizonbytes.com/miscellaneous/test.php

謝謝大家對你的幫助,在此問題上

+0

PHP可以有多個.ini文件和在該INI型覆蓋可以進行各種級別。在你的腳本中的某個地方運行'phpinfo()'來查看實際的本地效果設置是什麼。 –

+0

@MarcB當你運行http://bizonbytes.com/miscellaneous/test.php你會得到我認爲的信息。 – Yannick

回答

10

請注意,這是一個安全警告。使用cURL,網站可能會將腳本重定向到file:///etc/passwd之類的東西,並與周圍的事物混淆。爲防止出現這種情況,無論何時open_basedir被設置,cURL都不會跟蹤位置。您必須手動關注它們,並手動檢查所有後續位置是否安全。

This comment on php.net實現的一個示例實現:

function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) { 
    $mr = $maxredirect === null ? 5 : intval($maxredirect); 
    if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) { 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0); 
     curl_setopt($ch, CURLOPT_MAXREDIRS, $mr); 
    } else { 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
     if ($mr > 0) { 
      $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_FORBID_REUSE, false); 
      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 && --$mr); 
      curl_close($rch); 
      if (!$mr) { 
       if ($maxredirect === null) { 
        trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING); 
       } else { 
        $maxredirect = 0; 
       } 
       return false; 
      } 
      curl_setopt($ch, CURLOPT_URL, $newurl); 
     } 
    } 
    return curl_exec($ch); 
} 
+0

我不買這個作爲一個合理的解決方案。 – chovy

+4

我只是試了一下,它效果很好。謝謝您的發佈。 –

+0

我已經採取了preg_match部分和類似的設置,我已經在我的代碼解決url和像一個魅力的作品:) – Michael

相關問題