错误的请求。 通过主机和系统curl连接到网站

我有这个cURL代码在PHP中。

 curl_setopt($ch, CURLOPT_URL, trim("http://stackoverflow.com/questions/tagged/java")); curl_setopt($ch, CURLOPT_PORT, 80); //ignore explicit setting of port 80 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_ENCODING, ""); curl_setopt($ch, CURLOPT_HTTPHEADER, $v); curl_setopt($ch, CURLOPT_VERBOSE, true); 

HTTPHEADER的内容是;

 Proxy-Connection: Close User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: __qca=blabla Connection: Close 

它们中的每一个都是数组$v中的单个项目。

当我在主机上上传文件并运行代码时,我得到的是:

400错误的请求

您的浏览器发送无效请求。

但是当我使用命令行PHP在我的系统上运行它时,我得到的是

 < HTTP/1.1 200 OK < Vary: Accept-Encoding < Cache-Control: private < Content-Type: text/html; charset=utf-8 < Content-Encoding: gzip < Date: Sat, 03 Mar 2012 21:50:17 GMT < Connection: close < Set-Cookie: buncha cokkies; path=/; HttpOnly < Content-Length: 22151 < * Closing connection #0 

这不仅是在stackoverflow,发生这种情况,它也发生在4shared,但在谷歌和其他人的作品。

感谢您的帮助。

这不仅仅是一个答案,而是一个评论:从你的问题来看,具体触发400错误的具体内容并不清楚,特别是具体是什么意思,或者更具体:它的来源。

这是你的服务器的输出? 这是你用脚本输出的一些反馈(curl响应)吗?

为了更好地debugging,我想出了一个稍微不同的configurationforms,你可能会在使用curl扩展时感兴趣。 有一个很好的函数curl_setopt_array允许你一次设置多个选项。 如果其中一个选项失败,它将返回false。 它允许您在前面完整configuration您的请求。 所以你可以更容易地注入并用第二个(debugging)configurationreplace它:

 $curlDefault = array( CURLOPT_PORT => 80, //ignore explicit setting of port 80 CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_FOLLOWLOCATION => TRUE, CURLOPT_ENCODING => '', CURLOPT_HTTPHEADER => array( 'Proxy-Connection: Close', 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Encoding: gzip,deflate,sdch', 'Accept-Language: en-US,en;q=0.8', 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Cookie: __qca=blabla', 'Connection: Close', ), CURLOPT_VERBOSE => TRUE, // TRUE to output verbose information. Writes output to STDERR, or the file specified using CURLOPT_STDERR. ); $url = "http://stackoverflow.com/questions/tagged/java"; $handle = curl_init($url); curl_setopt_array($handle, $curlDefault); $html = curl_exec($handle); curl_close($handle); 

这可能会帮助您改进代码并进行debugging。

此外,您正在使用CURLOPT_VERBOSE选项。 这将把详细的信息放入STDERR – 所以你不能再跟踪它。 相反,您可以将其添加到输出中,以便更好地了解所发生的情况:

 ... CURLOPT_VERBOSE => TRUE, // TRUE to output verbose information. Writes output to STDERR, or the file specified using CURLOPT_STDERR. CURLOPT_STDERR => $verbose = fopen('php://temp', 'rw+'), ); $url = "http://stackoverflow.com/questions/tagged/java"; $handle = curl_init($url); curl_setopt_array($handle, $curlDefault); $html = curl_exec($handle); $urlEndpoint = curl_getinfo($handle, CURLINFO_EFFECTIVE_URL); echo "Verbose information:\n<pre>", !rewind($verbose), htmlspecialchars(stream_get_contents($verbose)), "</pre>\n"; curl_close($handle); 

这给出了以下输出:

 Verbose information: * About to connect() to stackoverflow.com port 80 (#0) * Trying 64.34.119.12... * connected * Connected to stackoverflow.com (64.34.119.12) port 80 (#0) > GET /questions/tagged/java HTTP/1.1 Host: stackoverflow.com Proxy-Connection: Close User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: __qca=blabla Connection: Close < HTTP/1.1 200 OK < Cache-Control: private < Content-Type: text/html; charset=utf-8 < Content-Encoding: gzip < Vary: Accept-Encoding < Date: Mon, 05 Mar 2012 17:33:11 GMT < Connection: close < Content-Length: 10537 < * Closing connection #0 

哪些应该为您提供所需的信息,以跟踪与请求/curl相关的事情。 然后,您可以轻松更改参数,看看是否有所作为。 同时比较你在本地安装的curl版本和服务器上的版本。 要获得它,请使用curl_version

 $curlVersion = curl_version(); echo $curlVersion['version']; // eg 7.24.0 

希望这可以帮助你跟踪事情。

根据http://php.net/manual/en/function.curl-setopt.php尝试设置;CURLOPT_ENCODING"gzip"

另外,我会尽量避免尽可能多的标题行,例如使用CURLOPT_COOKIE而不是Cookie: __qca__=blablaCURLOPT_USERAGENT

编辑:它似乎没有使用CURLOPT_HTTPHEADER数组(键=>值),是吗? 在这种情况下,使用数组和其他的东西,我写道,你会没事的。 (这是怎么做的,阅读手册:P)

希望有所帮助。