[英]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.