2015-04-06 47 views
2

我正在開發一個使用cURL將數據發佈到遠程服務器的wordpress插件。 這可以在最大的網站上正常工作,但在一些網站上,它只是出現了一個錯誤訪問被拒絕。使用代理/防火牆從服務器使用cURL發送到遠程服務器

[headers] => Array 
    (
     [server] => squid/3.3.8 
     [mime-version] => 1.0 
     [date] => Tue, 31 Mar 2015 07:32:51 GMT 
     [content-type] => text/html 
     [content-length] => 3406 
     [x-squid-error] => ERR_ACCESS_DENIED 0 
     [vary] => Accept-Language 
     [content-language] => en 
     [x-cache] => MISS from hproxy2.world4you.com 
     [x-cache-lookup] => NONE from hproxy2.world4you.com:3128 
     [via] => 1.1 hproxy2.world4you.com (squid/3.3.8) 
     [connection] => close 
    ) 

以上是我正在創建的響應。

下面是我使用

function testpost($ac,$d_name,$an,$data) { 
     $fields = ''; 
     foreach ($data as $key => $value) { 
      $fields .= $key . '=' . $value . '&'; 
     } 

     rtrim($fields, '&'); 
    $post = curl_init(); 
    curl_setopt($post, CURLOPT_RETURNTRANSFER,true); 
    curl_setopt($post, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
    curl_setopt($post, CURLOPT_URL, $ac); 
    curl_setopt($post, CURLOPT_POST, count($data)); 
    curl_setopt($post, CURLOPT_POSTFIELDS, $fields); 
    curl_setopt($post, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($post, CURLOPT_SSL_VERIFYHOST, 2); 
    $result = curl_exec($post); 
    echo "<pre>"; 
    print_r($result); 
    echo "</pre>";  

} 

而且,有些服務器就可以繼續執行,不返回任何代碼。對於這些無法弄清楚什麼是問題,甚至無法向用戶顯示一些錯誤消息,因爲它不會返回任何內容。

例如 如果我在abc.com上安裝插件並嘗試使用cURL到xyz.com/test.php進行POST,請在test.php中編寫代碼以將數據寫入文本文件以檢查abc.com的cURL請求是或者不在xyz.com上。但它沒有寫入任何文本文件意味着請求沒有從abc.com到達xyz.com。在這個我沒有得到任何迴應,它在很長一段時間繼續在abc.com上執行。

所以,我需要找出阻止你的要求是怎麼產生這個問題,我該怎麼員額從abc.com數據xyz.com

+0

我一定要改變我的插件來獲得服務器的代理服務器設置(在其上運行的插件)。例如curl_setopt($ ch,CURLOPT_PROXYPORT,$ proxyPort); curl_setopt($ ch,CURLOPT_PROXYTYPE,'HTTP'); curl_setopt($ ch,CURLOPT_PROXY,$ proxyIp); curl_setopt($ ch,CURLOPT_PROXYUSERPWD,$ loginpassw); – user2231113 2015-04-06 07:00:31

回答

1

您運行插件的網站或服務器位於防火牆後面,因此會阻止您的cURL請求。爲了克服這個插件的這個用戶必須通過他們的服務器代理設置。 見如下─

function testpost($ac,$d_name,$an,$data,$proxy_ip,$proxy_port,$login_passw) { 
    $fields = ''; 
    foreach ($data as $key => $value) { 
     $fields .= $key . '=' . $value . '&'; 
    } 

    rtrim($fields, '&'); 
$post = curl_init(); 
curl_setopt($post, CURLOPT_RETURNTRANSFER,true); 
curl_setopt($post, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($post, CURLOPT_URL, $ac); 
curl_setopt($post, CURLOPT_POST, count($data)); 
curl_setopt($post, CURLOPT_POSTFIELDS, $fields); 
curl_setopt($post, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($post, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($post, CURLOPT_PROXYPORT, $proxy_port); 
curl_setopt($post, CURLOPT_PROXYTYPE, 'HTTP'); 
curl_setopt($post, CURLOPT_PROXY, $proxy_ip); 
curl_setopt($post, CURLOPT_PROXYUSERPWD, $login_passw); 
$result = curl_exec($post); 
echo "<pre>"; 
print_r($result); 
echo "</pre>";  

}

+0

謝謝你Rajinder。但是,每個用戶都必須聯繫他們的託管支持,才能獲得關於他們poxy settins的詳細信息嗎? – user2231113 2015-04-07 05:45:54

+0

是的,如果他們不知道,那麼他們必須。 – 2015-04-07 05:47:31

0

魷魚(代理)的幫助。去看看魷魚的日誌爲什麼它阻止了請求。

+0

是的,從響應數組中可以清楚地看到某些代理/防火牆(squid)阻止了我的請求,但只有一臺服務器的情況是這樣,許多情況下它仍然執行並且不會返回任何內容。在這我怎麼能過來這個? – user2231113 2015-04-07 05:18:36

+0

總之我知道是什麼造成這個問題,但我需要解決方案來克服這個問題。我認爲這可以通過傳遞cURL代理設置(主機,端口,用戶名,密碼)來克服。但是許多用戶會在不同的服務器上使用這個插件,其中許多用戶不知道這些類型的設置(主機,端口,用戶名,密碼)。他們是否都需要聯繫他們的託管支持才能獲得這些cURL代理詳情? – user2231113 2015-04-07 05:18:55