【问题标题】:Getting error code 28 with cURL使用 cURL 获取错误代码 28
【发布时间】:2011-07-13 11:59:10
【问题描述】:

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

我正在尝试使用 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 访问时,它会超时(错误代码 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出了问题。服务器期望在请求标头中看不到引荐来源网址。当它这样做时,请求被阻止。这种行为当时可能在所有服务器上并不一致,但现在是。现在可以从请求标头中删除引荐来源网址并保留其他所有内容。

【问题讨论】:

  • 这两个 URL 中的用户 ID 是否不同?这是因为每个服务器都有 1 个吗?这是不寻常的,因为用户 ID 通常在单个服务中是通用的
  • 发现推荐人是问题所在。我已经更新了 OP。

标签: php json curl


【解决方案1】:

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

【讨论】:

  • 附带说明,请尝试删除CURLOPT_USERAGENT,这应该没什么大不了的,但除非绝对需要,否则我会删除它。
  • 我尝试删除 CURLOPT_HTTPHEADERCURLOPT_USERAGENT 但仍然没有乐趣。尝试继续超时。
  • 发现引荐来源网址是问题所在。我已经更新了 OP。再次感谢您的帮助:)
【解决方案2】:

试试这个

function get_data($url)
 {
  $ch = curl_init();
  $timeout = 5;
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
 }

 $returned_content = get_data('your url');

或者,您可以远程使用file_get_contents 功能,但许多主机不允许这样做

$userAgent = ‘Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0’;
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);

我使用的其他一些选项:

curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

试试这个:

 $ctx = stream_context_create( array(
                 'socket' => array(
                             'bindto' => '192.168.0.107:0',
    )
   ));

   $c= file_get_contents('http://php.net', 0, $ctx);

【讨论】:

  • 感谢您的建议。我现在正在测试各种 cURL 选项。 file_get_contents 不起作用。我在原始问题中添加了一些额外的信息。由于 cURL 确实适用于一个 URL,但不适用于发布的原始 URL。然而,它们实际上是相同的。唯一的例外是远程服务器。
  • 发现推荐人是问题所在。我已经更新了 OP。再次感谢您的帮助:)
猜你喜欢
  • 2012-02-13
  • 2011-04-05
  • 2013-04-04
  • 1970-01-01
  • 2012-08-01
  • 2017-12-28
  • 2011-08-13
相关资源
最近更新 更多