我试过这样做,但不起作用!
$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/");
谢谢!
我开始工作了。
1) 将标题Host: www.google.de
更改为Host: www.google.com
动机:Host
标头中指定的主机应该与URL的主机完全匹配。
2) 使用"www.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响应是一个额外的步骤,您可能不想执行。如果响应是未压缩的文本形式,那么处理它可能会更容易。
为了补充其他海报所说的内容,您也不能在CURLOPT_HTTPHEADER
数组中粘贴GET
命令,因为这是在其他cURL选项中指定的。cURL意味着使用CCD_ 9函数来操作;您不能通过将HTTP消息放在headers部分来绕过它。例如,为了确保您的命令是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。
此外,我不知道为什么要在GET
请求的HTTP头中放入Connection: Close
。在这个标题中,你告诉谷歌你正在关闭你的连接。;这是由curl_close($ch);
处理的,所以忘记那个标头。事实上,HTTP头中有一半的项目没有位置。例如,为什么要在请求中发送cookie以获取搜索结果?在发送之前,请确保您知道每个标头的作用。否则,您绝对无法判断是否发送了正确的标头。
您遇到了一些问题,但它们应该很容易解决。首先,您将头中的主机设置为与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的设计方式。
如果您需要对生成的HTTP请求进行如此高级别的控制,我建议您使用原始套接字函数手动发送请求。手册中甚至有一个使用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);
}
下次您应该更仔细地阅读精细手册。有一个如何添加字段的示例:array('Content-type: text/plain', 'Content-length: 100')
,不是一个字符串中的所有内容,而是字段是单独的数组元素。