PHP cURL不允许我设置POST请求,而是设置了GET

时间:2012-09-21 15:52:05

标签: php curl

        $this->curl = curl_init();
        curl_setopt($this->curl, CURLOPT_URL, 'http://something.com/send');
        curl_setopt($this->curl, CURLOPT_REFERER, 'http://something.com');
        curl_setopt($this->curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1');
        curl_setopt($this->curl, CURLOPT_ENCODING, 'gzip, deflate');
        curl_setopt($this->curl, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookies.txt');
        curl_setopt($this->curl, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookies.txt');
        curl_setopt($this->curl, CURLOPT_HTTPGET, 0);
        curl_setopt($this->curl, CURLOPT_POST, 1);
        curl_setopt($this->curl, CURLOPT_POSTFIELDS, 'name=john');
        curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
        @curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($this->curl, CURLOPT_HTTPPROXYTUNNEL, FALSE);
        curl_setopt($this->curl, CURLOPT_PROXY, $this->proxy['0']);
        curl_setopt($this->curl, CURLOPT_PROXYPORT, $this->proxy['1']);
        curl_setopt($this->curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
        curl_setopt($this->curl, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
        curl_setopt($this->curl, CURLOPT_PROXYUSERPWD, $this->proxy['2'] . ':' . $this->proxy['3']);
        curl_setopt($this->curl, CURLOPT_HEADER, 1);
        curl_setopt($this->curl, CURLINFO_HEADER_OUT, 1);
        curl_setopt($this->curl, CURLOPT_VERBOSE, 1);$this->website = curl_exec($this->curl);
        var_dump(curl_getinfo($this->curl));
        var_dump(curl_error($this->curl));
        echo $this->website;

所以getinfo告诉我: 获取http://something.com/send HTTP / 1.1

而不是 POST http://something.com/send HTTP / 1.1

这不是代理错误 - 我已经尝试过没有代理 - 同样的结果。

那么为什么cURL强迫GET?而不是做正常的POST请求?

1 个答案:

答案 0 :(得分:2)

发生这种情况的原因是因为您设置了CURLOPT_FOLLOWLOCATION

cURL实际上并没有执行POST的GET请求而是,它也是 。这是因为您要发布的URL使用POST/Redirect/GET模式,许多HTTP驱动的应用程序使用该模式。它基本上是一种帮助确保使用不会意外地执行两次操作的机制(简而言之,它比实际情况稍微复杂一点)。

当您将数据发布到服务器时,服务器会处理请求并发出重定向,以便它可以返回相关内容,而不是简单地将其返回到POST请求的响应中。

总而言之,您实际上并没有遇到任何问题。保持代码不变,远程服务器上的结果将是您所期望的 - 只要请求数据正确。