我尝试过这样的事情,但它不起作用!
$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 :(得分: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')
,而不是一个字符串中的所有字段,但字段是单独的数组元素。