Stack Overflow说PHP上的BAD REQUEST

时间:2012-03-04 07:37:21

标签: php curl

我在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 个答案:

答案 0 :(得分:1)

您的空CURLOPT_ENCODING参数导致问题。如果您不想要gzip / deflate,只需省略标题。

我也看到你在curl_setopt()和HTTP_HEADER数组中定义了编码。 您应该尽可能使用本机curl_setopt()命令。 CURLOPT_USERAGENT是您可以移出HTTP_HEADER数组的地方。

但正如安德鲁马歇尔所说,屏幕刮擦不是你应该做的事情;特别是因为他们有API。

修改

以下是我使用的示例脚本:

<?php

$v = 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-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'
);

$ch = curl_init();

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);

echo curl_exec($ch);
?>

现在我通过命令行运行它,但净效果是一样的。我删除了$v数组中的Accept-Encoding,因此我可以得到未压缩的输出。

我们尚未建立的一件事是您的PHP和libcurl版本。对我来说,这是带有libcurl 7.12.1的PHP 5.3.2。这很重要。您可以在命令行上通过php -i | grep -i curl找到libcurl版本,也可以通过服务器上基于Web的脚本找到phpinfo()

答案 1 :(得分:0)

似乎有些标题在某些网站上打破了预期的请求模式。解决此问题的最简单方法是逐个删除标题并进行测试。

我认为它应该是编码的。

答案 2 :(得分:-2)

似乎缺少“主机”标头:

Host: stackoverflow.com