2010-10-08 32 views
10

tôi đã nhận một lỗiphp curl với lỗi CURLOPT_FOLLOWLOCATION

CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in

i google nhiều giải pháp, nhưng với trang web này họ không làm việc. chỉ cần CURLOPT_FOLLOWLOCATION. hoster ngu ngốc không muốn kích hoạt safe_mode hoặc open_basedir. tôi có thể kích hoạt chúng một mình, có thể tạo htaccess với một số tham số không?

Trả lời

13

Lỗi có nghĩa là safe_mode hoặc open_basedir ĐƯỢC bật (có thể là open_basedir) có thể bạn không thể ghi đè lên nếu máy chủ của bạn có bất kỳ cài đặt bảo mật nào.

Vì vậy, bạn có thể lựa chọn

1) thay đổi máy chủ (không thực sự hấp dẫn tôi tưởng tượng)

2) sử dụng một chức năng tương tự như những người được tìm thấy trên trang curl_setopt php, tức là http://www.php.net/manual/en/function.curl-setopt.php#95027

Các sau đây là phiên bản cố định của hàm được chỉ định tại điểm 2

function curl_redirect_exec($ch, &$redirects, $curlopt_header = 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) { 
     list($header) = explode("\r\n\r\n", $data, 2); 

     $matches = array(); 
     preg_match("/(Location:|URI:)[^(\n)]*/", $header, $matches); 
     $url = trim(str_replace($matches[1], "", $matches[0])); 

     $url_parsed = parse_url($url); 
     if (isset($url_parsed)) { 
      curl_setopt($ch, CURLOPT_URL, $url); 
      $redirects++; 
      return curl_redirect_exec($ch, $redirects, $curlopt_header); 
     } 
    } 

    if ($curlopt_header) { 
     return $data; 
    } else { 
     list(, $body) = explode("\r\n\r\n", $data, 2); 
     return $body; 
    } 
} 
+0

vui, nhưng kịch bản hoạt động tốt trên máy chủ của tôi (rẻ và ảo), nhưng ông chủ sử dụng máy chủ lưu trữ ngu ngốc và không có mong muốn thay đổi. về chức năng này -i biết điều đó, khi tôi bắt đầu viết kịch bản theo cách thủ công, hãy gọi mỗi url, nhưng url cuối cùng sẽ không hoạt động, và chỉ sử dụng CURLOPT_FOLLOWLOCATION giúp tôi – kusanagi

+0

Eek xin lỗi tôi đã không thực sự kiểm tra hàm, bạn ' lại phải nó không hoạt động (nó giả định tiêu đề vị trí không phải là cuối cùng) Tôi đã thêm một phiên bản sửa chữa tôi đã thử nghiệm để trả lời của tôi. – Rwky

+1

Giải pháp của bạn có một vài lỗi. Regex phải là '[^ \ n]'. Khi đệ quy gọi 'curl_redirect_exec', bạn nên chuyển' $ curlopt_header'. –

0

Xin chào tôi sửa thêm điều kiện này:

$safeMode = @ini_get('safe_mode'); 
$openBasedir = @ini_get('open_basedir'); 
if (empty($safeMode) && empty($openBasedir)) { 
    curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true); 
}else 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

và thêm trong tập tin .htaccess tôi

php_flag safe_mode off 
php_flag open_basedir off 
+2

Các biến $ curl và $ curl_handle của bạn đến từ đâu? – Craig

1

Nếu bạn xác định rằng chỉ http và https giao thức được phép trong chuyển hướng sử dụng CURLOPT_REDIR_PROTOCOLS, bạn sẽ có thể sử dụng mà không cần CURLOPT_FOLLOWLOCATIONsafe_mode hoặc open_basedir.

+2

Đặt 'CURLOPT_REDIR_PROTOCOLS' thành' CURLPROTO_HTTP | CURLPROTO_HTTPS' dường như không giúp ích gì cho 'open_basedir'. – Mahn

+0

Giống như tôi ... – zeflex