2012-03-02 88 views
4

我试过做这样的事情,但它不起作用!如何将curl与HEADERS一起使用?

$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/"); 

谢谢!

+0

你是否试图在setopt()中隐式设置一个数组?或不同的东西? – Xailor 2012-03-02 19:51:13

+0

为什么不使用手册中解释的逗号分隔标题选项? – Dan 2012-03-02 19:53:38

+0

喜欢如何? @担? – Blank 2012-03-02 20:00:16

回答

4

我得到它的工作。

1)更改标题Host: www.google.deHost: www.google.com

动机:在Host头应该完全匹配的URL的主机指定的主机。

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请求标头。

动机:如果您告诉Google您有能力收到压缩的回复,他们会向您发送一封回复。解压缩HTTP响应是您可能不想采取的额外步骤。如果处于未压缩的文本形式,处理响应可能更容易。

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); 
} 
+0

Fsockopen已禁用。这就是为什么我使用卷曲! – Blank 2012-03-02 19:59:19

1

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

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,这只是卷曲API的设计方式。

4

要添加到其他海报中所说的内容,您也不能在CURLOPT_HTTPHEADER数组中粘贴GET命令,因为这是在其他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");来设置网址。

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

相关问题