如何使用卷轴与HEADERS?

时间:2012-03-02 19:49:21

标签: php curl

我尝试过这样的事情,但它不起作用!

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://google.com/"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('GET /search?q=kk HTTP/1.1
Host: www.google.de
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Proxy-Connection: Close
Cookie: PREF=ID=2bb051bfbf00e95b:U=c0bb6046a0ce0334:
Cache-Control: max-age=0
Connection: Close
'));
$response = curl_exec($ch); 
curl_close($ch);   



    echo $response;

此外,是否可以在不设置URL的情况下使用标题生成整个请求?我的意思是没有这个?

curl_setopt($ch, CURLOPT_URL, "http://google.com/"); 

谢谢!

5 个答案:

答案 0 :(得分:4)

我得到了它的工作。

1)将标题Host: www.google.de更改为Host: www.google.com

动机:Host标题中指定的主机应与网址主机完全匹配。

2)使用“www.google.com”代替“google.com”

动机:对google.com发出的搜索请求不会检索搜索结果。您将被告知要访问www.google.com。

3)将完整的URL设置为CURLOPT_URL,而不仅仅是主机名。例如。将CURLOPT_URL更改为curl_setopt($ch, CURLOPT_URL, "http://www.google.com/search?q=kk");

动机:正确使用cURL API。

4)从CURLOPT_HTTPHEADER中移除GET /search?q=kk HTTP/1.1 - 它放错地方了。

动机:正确使用cURL API。

5)响应将是gzip或deflate压缩。要停止此操作,请删除Accept-Encoding: gzip, deflate请求标题。

动机:如果你告诉谷歌你能够收到压缩回复,他们会发给你一个。解压缩HTTP响应是您可能不想进行的额外步骤。如果响应处于未压缩的文本形式,则处理响应可能更容易。

答案 1 :(得分:4)

要添加其他海报所说的内容,您也不能在GET数组中粘贴CURLOPT_HTTPHEADER命令,因为这是在其他cURL选项中指定的。 cURL旨在使用curl_setopt函数进行操作;您不能通过将HTTP消息放入标题部分来绕过它。例如,要确保您的命令是HTTP GET操作,请将CURLOPT_HTTPGET设置为TRUE(尽管默认情况下,cURL会发送GET,直到您将其更改为某些内容为止其他人)。

要解决为什么无法找到正确的URL的问题,那是因为您需要在CURLOPT_URL中指定整个路径名,而不仅仅是主机。所以,你应该写curl_setopt($ch, CURLOPT_URL, "http://google.de/search?q=kk HTTP/1.1");来设置URL。

此外,我不知道您为什么要将Connection: Close放入GET请求的HTTP标头中。在该标题中,您告诉Google您正在关闭您的连接。这由curl_close($ch);处理,所以忘掉那个标题。实际上,HTTP标头中有一半的项目没有位置。例如,为什么要在请求中发送cookie以获取搜索结果?在发送之前,请确保您知道每个标头的作用。否则,你绝对无法判断你是否正在发送正确的标题。

答案 2 :(得分:2)

你有一些问题,但它们应该很容易理清。首先,您在URL请求中设置的标头中的主机与主机不同,但由于您正在使用HTTP1.0,因此无论如何都不需要。

其次,您需要将HTTPHEADER中的每一行作为数组中自己的东西,并且不包含GET行。

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language: en-gb,en;q=0.5',
    'Accept-Encoding: gzip, deflate',
    'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
    'Proxy-Connection: Close',
    'Cookie: PREF=ID=2bb051bfbf00e95b:U=c0bb6046a0ce0334:',
    'Cache-Control: max-age=0',
    'Connection: Close'
));

(你清楚地从Firefox中窃取了这个版本,并且在那个版本中,我们会让它滑动。)最后,是的,你必须指定CURLOPT_URL,这就是cURL API的设计方式。

答案 3 :(得分:1)

如果您需要对生成的HTTP请求进行如此高级别的控制,我建议您使用raw socket functions来手动发送请求。该手册甚至还有一个使用fsockets执行HTTP请求的示例:

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

答案 4 :(得分:1)

下次你应该仔细阅读精细的手册。有一个示例如何添加字段:array('Content-type: text/plain', 'Content-length: 100'),而不是一个字符串中的所有字段,但字段是单独的数组元素。