【发布时间】:2011-07-13 11:59:10
【问题描述】:
问题已解决 - 请参阅本文末尾的答案
我正在尝试使用 PHP / cURL 从远程服务器检索数据
如果我将以下 URL 放入浏览器,数据会正确返回。
但是,当我尝试使用 PHP/cURL 访问时,它会超时(错误代码 28)。
$json = curl($jsonurl, $realm['intRealmID'], $realm['strRealmServer']);
function curl($url, $realm, $realmServer){
$header = array();
$header[] = 'Host: realm'.strval($realm).'.'.$realmServer.'.castle.wonderhill.com';
$header[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$header[] = 'Accept-Language: en-us,en;q=0.5';
$header[] = 'Accept-Encoding: gzip,deflate';
$header[] = 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7';
$header[] = 'Connection: keep-alive';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0');
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
return curl_exec($ch);
curl_close($ch);
}
任何人都知道为什么它可以在浏览器上运行,但不能通过 cURL 运行?谢谢
附加信息 虽然 cURL 不适用于上面的 URL。对于下面的 URL,它工作得很好。唯一的区别是请求数据的服务器。数据本身和 POST 是相同的。
回答
最后回到这个,发现是referrer出了问题。服务器期望在请求标头中看不到引荐来源网址。当它这样做时,请求被阻止。这种行为当时可能在所有服务器上并不一致,但现在是。现在可以从请求标头中删除引荐来源网址并保留其他所有内容。
【问题讨论】:
-
这两个 URL 中的用户 ID 是否不同?这是因为每个服务器都有 1 个吗?这是不寻常的,因为用户 ID 通常在单个服务中是通用的
-
发现推荐人是问题所在。我已经更新了 OP。