2011-08-02 80 views
17

所以,我不斷收到多個服務器上的這個惱人的錯誤(它的一個警告,所以我會忽略它,但我需要的功能)CURLOPT_FOLLOWLOCATION不能被激活

警告:curl_setopt()[function.curl -setopt]:CURLOPT_FOLLOWLOCATION不能當啓用safe_mode設置或激活了open_basedir在/home/xxx/public_html/xxx.php設定上線56

我怎麼會去通過SSH該固定?

+0

什麼是您的設置(安全模式和/或打開basedir啓用?),你想達到什麼? – aefxx

回答

13

在您的php.ini文件中設置safe_mode = Off(通常位於服務器上的/ etc /目錄中)。如果已經關閉,那麼在php.ini文件中查找open_basedir的東西,並相應地更改它。

基本上,後續位置選項已被禁用作爲安全措施,但PHP的內置安全功能通常比安全更惱人。實際上,safe_modeis deprecated in PHP 5.3

+2

@大蘭花:被摧毀意味着它仍然存在,並按預期工作,但它非常灰心。它可以並且經常在較老的共享主機平臺上啓用。我同意safe_mode充其量是惱人的。 – Wrikken

+0

@Wrikken:你說得對,對不起。但我相信,safe_mode將會徹底消失在PHP 6中。這不是說現在有任何幫助。不過,我把這兩個混在一起。 – Flambino

+2

btw:按照http://www.php.net/releases/NEWS_5_4_0_alpha1.txt在PHP 5.4中刪除safe_mode – Floern

1

只要在php.ini文件中啓用了open_basedirsafe_mode,就不能使用CURLOPT_FOLLOWLOCATION配置。要更改這些設置,我只能給一般注意事項:

  1. SSH服務器CD到包含php.ini中的目錄(通常是/ etc/Linux上PHP5,取決於你的發行版或OS)
  2. sudo編輯(例如,sudo nano php.ini)。
  3. 編輯指定open_basedir或safe_mode並將其關閉的行。

記得在之後重新啓動你的httpd!

11

試試這個,如果需要重定向和安全模式被激活,它遵循基於標題的鏈接(如果你抓雖然這不起作用,但是它將標題添加到返回中),這是針對您的特定問題的解決方法,當客戶安裝了我的腳本之一時,我遇到了同樣的問題,因此必須提出此問題。它也會將錯誤記錄到:curl.error.log ..有用的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; 
} 
+0

你「可能」不想添加檢查新的URL不是文件:// url。這可能會暴露「file:///myproject/database.php」等內容,默認情況下自7.19.4(請參閱CURLOPT_REDIR_PROTOCOLS),cURL不允許這些內容。較低版本的捲曲沒有這種限制,這就是爲什麼CURLOPT_FOLLOWLOCATION不允許在安全模式下使用。 –

+0

未定義的變量:referer – 2013-11-12 11:05:57

+0

@ 2astalavista謝謝修復 –

2

爲了解決這個問題,簡單地說safe_mode = Off和明確open_base_dir在php.ini文件。

+2

如果您位於無法訪問php.ini的共享服務器上,這不是一個選項。 – Paul