[英]Bad Request. Connecting to sites via curl on host and system
我在 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 上也会发生,但适用于 google 和其他人。
谢谢你的帮助。
这与其说是回答,不如说是评论:从您的问题来看,尚不清楚是什么具体触发了 400 错误,也不清楚它的具体含义或更具体:它的来源。
那是你服务器的输出吗? 这是您用脚本输出的一些反馈(卷曲响应)吗?
为了更好地调试,我提出了一种稍微不同的配置形式,您在使用 curl 扩展时可能会感兴趣。 有一个名为curl_setopt_array
的好函数,它允许您一次设置多个选项。 如果其中一个选项失败,它将返回 false。 它允许您在前面完整地配置您的请求。 因此,您可以更轻松地注入并使用第二个(调试)配置替换它:
$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);
这可能会帮助您改进代码和调试事物。
此外,您正在使用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_version
:
$curlVersion = curl_version();
echo $curlVersion['version']; // e.g. 7.24.0
希望这可以帮助您跟踪事情。
根据http://php.net/manual/en/function.curl-setopt.php尝试将CURLOPT_ENCODING
为"gzip"
另外,我会尽量避免使用尽可能多的标题行,例如使用CURLOPT_COOKIE
而不是Cookie: __qca__=blabla
或CURLOPT_USERAGENT
编辑:您似乎没有为 CURLOPT_HTTPHEADER 使用数组(键 => 值),是吗? 在这种情况下,使用数组和其他东西,我写道,你会没事的。 (这是如何完成的,请阅读手册:P)
希望有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.