从使用代理/防火墙的服务器发布到使用cURL的远程服务器


post to a remote server using cURL from a server using proxy/firewall

我正在开发一个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将其POST到xyz.com/test.php,那么在test.php中,我已经编写了将数据写入文本文件的代码,以检查来自abc.com的cURL请求是否在xyz.com上到达。但它没有在文本文件中写入任何内容,这意味着请求无法从abc.com到达xyz.com。在这种情况下,我没有得到任何响应,它在abc.com上执行了很长一段时间。

因此,我需要帮助找出造成这个问题的原因,以及如何将数据从abc.com POST到xyz.com

运行插件的网站或服务器位于防火墙后面,因此它会阻止您的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>";      

}

squid(代理)正在阻止您的请求。去看看squid的日志,为什么它会阻止请求。