繁体   English   中英

PHP curl自动在HTTP GET请求中设置主体

[英]Php curl automatically set body in HTTP GET request

这是我的问题。 我有三种环境(apache + mysql + mongoDB):持续集成,UAT和Prod。

所有这三种环境都位于同一proxmox上托管的不同VM上,并且可以通过nginx服务器进行访问。

我使用Php curl下载CSV文件。 对于特定的CSV文件提供程序,php curl无法在Continuous Intergration环境上下载文件,而在UAT和Prod上却无法下载。 经过数小时的调查,我认为最接近问题的方法是输出请求标头。

如下所示,在持续集成环境中,php curl设置了“ Content-Length”标头,表明它正在GET请求中发送正文。 我暂时无法调试此请求正文。

我真的不明白为什么php curl会在CI环境中添加此请求正文,尤其是当它在UAT和Prod env中不这样做时。

我还加入了php curl设置代码。

任何帮助,将不胜感激 :)

(Request Header in Continuous Integration Env)
------------------------------------------
HTTP/1.1 413 Request Entity Too Large
Date: Mon, 15 Dec 2014 21:01:22 GMT
Server: Apache
Content-Length: 341
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>413 Request Entity Too Large</title>
</head><body>
<h1>Request Entity Too Large</h1>
The requested resource<br />/export/export<br />
does not allow request data with GET requests, or the amount of data provided in
the request exceeds the capacity limit.
</body></html>
-----------------------------------------

(Request Header UAT Env)
------------------------------------------
HTTP/1.1 200 OK
Date: Mon, 15 Dec 2014 21:05:35 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/plain; charset=UTF-8

+ CSV data
----------------------------------------------

php curl设置代码:

public function getResource($url, $outputHeaders = false, $timeout = false)
{
    $ch = curl_init($url);

    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69 Safari/537.36');

    // Follow redirections
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    // Use navigation cookies
    $cookieFilePath = APP . 'tmp' . DS . 'cookies' . DS . 'curl_cookie.txt';
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFilePath);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFilePath);

    // Trust any certificate
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    if ($timeout) {
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);

        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    }

    if($outputHeaders)
        curl_setopt($ch, CURLOPT_HEADER, 1);

    $data = curl_exec($ch);

    if(curl_errno($ch))
    {
        throw new Exception('Erreur Curl : ' . curl_error($ch));
    }

    if(empty($data))
        throw new Exception('Curl returned an empty html page.');

    $encoding = self::getEncoding($ch, $data);

    $html['data'] = $data;
    $html['encoding'] = $encoding;
    $html['effective_url'] = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

    curl_close($ch);

    return $html;
}

首先,我不是输出请求标头,而是响应一个。

我安装了MITM代理( http://mitmproxy.org/-易于安装,易于使用),该代理可以从终端进行流量监视,并且我可以看到curl在从持续集成环境发出请求时正在发送cookie,但事实并非如此。从UAT环境发送任何内容。

在持续集成环境中删除发送的cookie可解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM