代理后面有file_get_contents吗?


74

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

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

我是否可以设置某种高级php设置,以便在内部每次尝试调用类似file_get_contents()内容时都总是通过代理进行?我在Windows ATM上,所以如果那是唯一的方法,那么重新编译会很麻烦。

我的解决方法是暂时的,原因是我需要一个通用的解决方案,该解决方案可以为多个用户使用,而不是使用一个用户的凭据(我曾考虑过单独请求一个单独的用户帐户来执行此操作,但是密码经常更改,因此需要在整个过程中部署此技术十几个或更多站点)。我基本上不想对证书进行硬编码以使用curl解决方法。

Answers:


173

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标头传递给代理,其中包含您的登录名和密码。

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


马丁,我有一个代理自动配置(pac)文件,而不是单个代理服务器。另外,它还需要NTLM身份验证。你能帮我一下吗?
codeomnitrix

我收到以下错误:无法打开流:无法找到套接字传输“ http”-在配置PHP时是否忘记启用它?我正在使用启用了curl的PHP5.5 / Apache2.4。
Tuan Anh Hoang-Vu 2014年

十分感谢。通常,cURL会让我满意,但是我正在试用Appengine PHP,并且没有cURL laode,因此具有流上下文的file_get_content拯救了我:D
m3nda 2014年

@codeomnitrix,可能有点晚了,但是我遇到了同样的问题,我将pac文件的网址粘贴到了浏览器中,并且在文件中我可以找到代理IP地址。
Martin Lietz '18

对于任何人:就我而言,也有必要使用它tcp作为协议。在使用http导致错误的信息之前:无法打开流:无法找到套接字传输“ http”-在配置PHP时是否忘记启用它?
罗布(Robsch)

23

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

2

根据代理登录的工作方式,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

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

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.