2015-04-06 72 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