2012-03-04 11 views
1

次のスクリプトを使用して外部サイトにデータを送信しています。以下の例では、$ method、$ url、および$ postdataはすでにユーザーによって収集されています。彼らはのfopen()リクエストを好きではないので、PHPから送信されたHTTPリクエストの403エラーを防ぐには?

foreach($postdata as $key => $value) 
{ 
    $data .= $key . '=' . $value . '&'; 
} 

if ($method == 'POST') { 

    // Set headers 
    $headers = array('http' => array(
      'method' => $method, 
      'header' => "accept-language: en\r\n" . 
      "Host: $host\r\n" . 
      "Referer: $url\r\n" . 
      "Content-Type: application/x-www-form-urlencoded\r\n", 
      'content' => $data)); 

    // Send request and retreive response 
    $context = stream_context_create($headers); 
    $fp = fopen($url, 'rb', false, $context); 
    fpassthru($fp); 
    fclose($fp); 

} else if ($method == 'GET') { 

    // Set headers 
    $headers = array('http' => array(
      'method' => $method, 
      'header' => "accept-language: en\r\n" . 
      "Host: $host\r\n" . 
      "Referer: $url\r\n" . 
      "Content-Type: application/x-www-form-urlencoded\r\n")); 

    // Append url 
    $url .= '?' . $data; 

    // Send request and retreive response 
    $context = stream_context_create($headers); 
    $fp = fopen($url, 'rb', false, $context); 
    fpassthru($fp); 
    fclose($fp); 

} else { 
    echo 'Invalid method.'; 
} 

それはほとんどの場合、正常に動作します、しかし、いくつかのサイトでは表向き、禁断の403を返送します。これを回避する方法はありますか?代わりにcURLを使用すると、403が防止されますか?もしそうなら、上記を行うためのcURLの方法は何でしょうか?ありがとう。

+1

403はfopen vs cURLとはほとんど関係がありませんが、一般的にあなたの呼び出しが気に入らないという事実です。これは、referer(または、好きではないreferer、ホットリンク保護を呼び出す)が不足している可能性があります。また、アクセスしようとしているURLがパスワードで保護されているか、単に禁止されているか、特定のセッションCookieが必要な場合もあります。これは実際にサイトによって異なるので、ブランケットの回答はありません。だからこそ、私は間違いなく一般的にcuRLを使用することをお勧めします(そして、そうしたくないサイトを削ってはいけません)。 – Morgon

+0

私は要求されたURLに設定しているので、私はそのrefererとは思わない。そして、それは他のもののどれでもありません。私はcURLソリューションを検討します。そして、私はサイトを削っていません:) – Joey

答えて

1

ヘッダーとともにUSER-AGENTを渡すことをお勧めします。私はリモートシステムにログインしてデータを取得する必要のあるプロジェクトに取り組んだが、これらのシステムの中には、有効なユーザーエージェントを渡さなかった場合、ログイン資格情報は正しく設定してください。

関連する問題