web-dev-qa-db-ja.com

プロキシの背後にあるfile_get_contents?

職場では、たとえばポート80に基本的にアクセスするためにプロキシを使用する必要があります。たとえば、ユーザーごとに独自のカスタムログインがあります。

私の一時的な回避策は、curlを使用して、基本的にプロキシ経由で自分自身としてログインし、必要な外部データにアクセスすることです。

内部でfile_get_contents()のようなものを呼び出そうとするたびに常にプロキシを通過するように設定できる高度なphp設定がありますか?私はWindows ATMを使用しているので、それが唯一の方法だと再コンパイルするのは苦痛です。

私の回避策が一時的な理由は、1人のユーザーの資格情報を使用するのではなく、複数のユーザーに対して機能する一般的なソリューションが必要なためです(これを行うためだけに別のユーザーアカウントを要求することを検討しましたが、パスワードは頻繁に変更され、この手法は全体に展開する必要がありますダース以上のサイト)。基本的にcurl回避策を使用するために資格情報をハードコードしたくありません。

69
meder omuraliev

認証を必要としないプロキシ経由で file_get_contents() を使用するには、次のようにします。

(これをテストすることはできません:プロキシに認証が必要です)

$aContext = array(
    'http' => array(
        'proxy'           => 'tcp://192.168.0.2:3128',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;

もちろん、私のプロキシのIPとポートを、あなたのものに問題のないものに置き換えてください;-)

そのようなエラーが発生する場合:

Warning: file_get_contents(http://www.google.com) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 407 Proxy Authentication Required

これは、プロキシに認証が必要であることを意味します。

プロキシで認証が​​必要な場合、次のように数行を追加する必要があります。

$auth = base64_encode('LOGIN:PASSWORD');

$aContext = array(
    'http' => array(
        'proxy'           => 'tcp://192.168.0.2:3128',
        'request_fulluri' => true,
        'header'          => "Proxy-Authorization: Basic $auth",
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;

IPとポート、そして今回はLOGINとPASSWORDについても同じことです;-)すべての有効な httpオプション をチェックアウトします。

ここで、ログインとパスワードを含む Proxy-Authorization ヘッダーをプロキシに渡します。

そして...ページが表示されるはずです;-)

162
Pascal MARTIN

つかいます stream_context_set_default 関数。 file_get_contentsまたは同様の関数を追加のパラメーターを渡さずに直接使用できるため、使用がはるかに簡単です

これは ブログ投稿 の使い方を説明しています。そのページのコードは次のとおりです。

<?php
// Edit the four values below
$PROXY_Host = "proxy.example.com"; // Proxy server address
$PROXY_PORT = "1234";    // Proxy server port
$PROXY_USER = "LOGIN";    // Username
$PROXY_PASS = "PASSWORD";   // Password
// Username and Password are required only if your proxy server needs basic authentication

$auth = base64_encode("$PROXY_USER:$PROXY_PASS");
stream_context_set_default(
 array(
  'http' => array(
   'proxy' => "tcp://$PROXY_Host:$PROXY_PORT",
   'request_fulluri' => true,
   'header' => "Proxy-Authorization: Basic $auth"
   // Remove the 'header' option if proxy authentication is not required
  )
 )
);

$url = "http://www.pirob.com/";

print_r( get_headers($url) );

echo file_get_contents($url);
?>
21
Pirob.com

同様の投稿がここにあります: http://techpad.co.uk/content.php?sid=137 方法を説明しています。

function file_get_contents_proxy($url,$proxy){

    // Create context stream
    $context_array = array('http'=>array('proxy'=>$proxy,'request_fulluri'=>true));
    $context = stream_context_create($context_array);

    // Use context stream with file_get_contents
    $data = file_get_contents($url,false,$context);

    // Return data via proxy
    return $data;

}
1
Paul

プロキシログインの仕組みによっては stream_context_set_default が役立つ場合があります。

$context  = stream_context_set_default(
  array(
    'http'=>array(
      'header'=>'Authorization: Basic ' . base64_encode('username'.':'.'userpass')
    )
  )
);
$result = file_get_contents('http://..../...');
1
VolkerK