php - 使用 cURL 获取错误代码 28

标签 php json curl

此问题已解决 - 请参阅本文末尾的答案

我正在尝试使用 PHP/cURL 从远程服务器检索数据

如果我将以下 URL 放入浏览器,数据会正确返回。

http://realm103.c7.castle.wonderhill.com/api/map.json?user%5Fid=5245274&x=375&y=375&timestamp=1310554325&%5Fsession%5Fid=5b2070a46a083a33e053d60dbc2d062e&dragon%5Fheart=098d2deb0a37f18c97428d636c456572f9bade24&version=3

但是,当我尝试使用 PHP/cURL 访问 if 时,它只是超时(错误代码 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是一样的。

http://realm4.c5.castle.wonderhill.com/api/map.json?user%5Fid=1053774&x=375&y=375&timestamp=1310616808&%5Fsession%5Fid=5b2070a46a083a33e053d60dbc2d062e&dragon%5Fheart=f35f476facab91f0e901eaf2209a0c8a9b9bedcc&version=3

回答

终于回到这个,发现是referrer的问题。服务器期望在请求 header 中看不到引荐来源网址。当它这样做时,请求被阻止。这种行为当时可能在所有服务器上都不一致,但现在是这样了。从请求 header 中删除引荐来源网址并保留其他所有内容现在可以正常工作。

最佳答案

您的 cURL 函数与直接请求信息之间的最大区别是 CURLOPT_HEADER 属性,我会首先尝试从代码中删除它。

关于php - 使用 cURL 获取错误代码 28,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6678487/

相关文章:

javascript - 如何使用 couchdb 列表函数从 couchdb View 结果中获取特定字段

json - 使用 XQuery 检查 XML 文档的命名空间前缀是否在整个文件中被重新定义

swift - 如何使用 github api 为仓库加注星标

php - 不能使用 CURLOPT_INTERFACE

PHP 传递一个类作为引用?

php - 如何从网站的数据库中抓取链接?

php - 尝试将 MYSQL 查询分成两部分

php - 时间跨度中的mysql时间跨度

json - Pandas read_json - 停止将索引转换为日期时间

使用 curl 为 PAM 模块编译目标文件