代理后面的file_get_contents?

时间:2009-08-26 17:14:19

标签: php proxy

在工作中,我们必须使用代理基本上访问端口80,例如,我们为每个用户都有自己的自定义登录。

我的临时解决方法是使用curl基本上通过代理登录并访问我需要的外部数据。

我可以设置一些高级的php设置,以便在内部尝试调用类似file_get_contents()的内容时,它总是通过代理吗?我在Windows ATM上,如果这是唯一的方法,重新编译会很痛苦。

我的解决方法是临时性的原因是因为我需要一个通用的解决方案,适用于多个用户而不是使用一个用户的凭据(我考虑过单独请求一个单独的用户帐户,但密码经常更改,此技术需要部署在十几个或更多站点)。我不想硬编码凭证基本上使用curl解决方法。

4 个答案:

答案 0 :(得分:158)

要通过/不通过不需要身份验证的代理使用file_get_content,应该这样:

(我无法测试这个:我的代理需要身份验证)

$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和端口替换为适合您的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; - )

现在,您正在向代理传递Proxy-Authorization标头,其中包含您的登录名和密码。

并且......应该显示页面; - )

答案 1 :(得分:20)

使用stream_context_set_default功能。它更容易使用,因为您可以直接使用file_get_contents或类似函数而不传递任何其他参数

blog post解释了如何使用它。这是该页面的代码。

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

答案 2 :(得分:1)

取决于代理登录的工作方式stream_context_set_default可能对您有所帮助。

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

答案 3 :(得分:1)

这里有类似的帖子: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;

}