file_get_contents behind a proxy?

匿名 (未验证) 提交于 2019-12-03 02:11:02

问题:

At work we have to use a proxy to basically access port 80 for example, we have our own custom logins for each user.

My temporary workaround is using curl to basically login as myself through a proxy and access the external data I need.

Is there some sort of advanced php setting I can set so that internally whenever it tries to invoke something like file_get_contents() it always goes through a proxy? I'm on Windows ATM so it'd be a pain to recompile if that's the only way.

The reason my workaround is temporary is because I need a solution that's generic and works for multiple users instead of using one user's credentials ( Ive considered requesting a separate user account solely to do this but passwords change often and this technique needs to be deployed throughout a dozen or more sites ). I don't want to hard-code credentials basically to use the curl workaround.

回答1:

To use file_get_content over/through a proxy that doesn't require authentication, something like this should do :

(I'm not able to test this one : my proxy requires an authentication)

$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; 

Of course, replacing the IP and port of my proxy by those which are OK for yours ;-)


If you're getting that kind of error :

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 

It means your proxy requires an authentication.


If the proxy requires an authentication, you'll have to add a couple of lines, like this :

$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; 

Same thing about IP and port, and, this time, also LOGIN and PASSWORD ;-)

Now, you are passing an Proxy-Authorization header to the proxy, containing your login and password.

And... The page should be displayed ;-)


Hope this helps ! Have fun !



回答2:

Use stream_context_set_default function. It is much easier to use as you can directly use file_get_contents or similar functions without passing any additional parameters

This blog post explains how to use it. Here is the code from that page.

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


回答3:

Depending on how the proxy login works stream_context_set_default might help you.

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


回答4:

There's a similar post here: http://techpad.co.uk/content.php?sid=137 which explains how to do it.

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;  } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!