我在php中有这个cURL
代码。
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上,但在谷歌和其他人上有效。
谢谢你的帮助
3条答案
按热度按时间8yparm6h1#
这更像是一个评论而不是一个答案:从你的问题中,我们并不清楚是什么具体地触发了400错误,也不清楚它的具体含义是什么。它的来源。
这是你的服务器的输出吗?这是你用脚本输出的一些反馈(curl响应)吗?
为了更好地调试,我提出了一种稍微不同的配置形式,您可能会在使用curl扩展时感兴趣。有一个很好的函数叫做
curl_setopt_array
,它允许你一次设置多个选项。如果其中一个选项失败,它将返回false。它允许您在前面完整地配置您的请求。因此,您可以更轻松地注入并使用第二个(调试)配置替换它:字符串
这可能有助于您改进代码和调试。
此外,您正在使用
CURLOPT_VERBOSE
选项。这将把详细信息放入STDERR
中-因此您无法再跟踪它。相反,您可以将其添加到输出中,以更好地查看发生了什么:型
它给出了以下输出:
型
如果它们与request/curl相关,它应该为您提供跟踪所需的信息。然后,您可以轻松地更改参数,看看是否有所不同。另外,将本地安装的curl版本与服务器上的版本进行比较。要获得它,请使用
curl_version
:型
希望这能帮助你追踪事情。
这个答案的一个较少扩展的变体可以在Q&A PHP - Debugging Curl中找到。
另一个交叉引用是Make cURL output STDERR to file (or string)。
gg0vcinb2#
根据http://php.net/manual/en/function.curl-setopt.php,尝试将
CURLOPT_ENCODING
设置为"gzip"
另外,我会尽量避免使用尽可能多的标题行,例如使用
CURLOPT_COOKIE
而不是Cookie: __qca__=blabla
或CURLOPT_USERAGENT
编辑:看起来你没有使用数组(key => value)来表示CURLOPT_HTTPHEADER,是吗?在这种情况下,使用数组和其他东西,我写道,你会没事的。(如何做到这一点,阅读手册:P)
希望能帮上忙。
wz1wpwve3#
这对我很有效
字符串
的数据