2011-07-13 43 views
3

のcURLでエラーコード28を取得する - 私は置けば、私はこれが解決されている

カールPHPを/使用してリモートサーバーからデータを取得しようとしていますTHIS POST

の終わりにANSWERを参照してくださいブラウザに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を介して、ブラウザからの作品ではなく、なぜ

誰もが任意のアイデアがありますか?ありがとう

追加情報 上記のURLではcURLが機能していませんが、その下の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

最後に戻ってこれに対する答え

とリファラが問題であることがわかりました。サーバーは要求ヘッダーにリファラーがないと予想していました。それが要求されたとき、要求はブロックされました。その動作は、当時はすべてのサーバーで一貫していなかったかもしれませんが、今はそれです。リクエストヘッダーからリファラーを削除し、他のものをすべて同じものにしておくようになりました。

+0

ユーザーIDが2つのURLで異なる理由はありますか?これは、各サーバーごとに1つあるためですか?ユーザーIDは通常、1つのサービスで共通であるため、これは珍しいことです – Ryan

+1

リファラーが問題であることがわかりました。私はOPを更新しました。 – runey71

答えて

1

あなたのcURL関数と情報を直接要求することの最大の違いは、CURLOPT_HEADERプロパティです。これをコードから削除してみます。

+0

副題として、 'CURLOPT_USERAGENT'も削除してみてください。大したことではありませんが、絶対に必要でない限り削除します。 – Ryan

+0

私は 'CURLOPT_HTTPHEADER'と' CURLOPT_USERAGENT'を削除しようとしましたが、まだ喜んでいません。試行は引き続きタイムアウトします。 – runey71

+0

リファラーが問題であることが判明しました。私はOPを更新しました。あなたの助けをもう一度ありがとう:) – runey71

1

は、リモートfile_get_contents機能を使用することができ、またこの

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'); 

を試してみたが、多くのホストは、いくつかの他のオプションは、私が使用してこの

$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); 
+0

あなたのsugestionsありがとうございます。私は今、さまざまなcURLオプションをテストしています。 'file_get_contents'は動作しません。 元の質問に追加情報を追加しました。 cURLは1つのURLでは動作しますが、元のURLでは動作しません。しかし、それらは実質的に同一である。唯一の例外はリモートサーバーです。 – runey71

+0

追加のcURLオプションを試しただけで、まだ運がありません:( – runey71

+0

あなたはbindtoを使用しましたか? – jeni