2009-08-26 37 views
59

En el trabajo, tenemos que usar un proxy para acceder básicamente al puerto 80, por ejemplo, tenemos nuestros propios inicios de sesión personalizados para cada usuario.file_get_contents detrás de un proxy?

Mi solución temporal es usar curl para básicamente iniciar sesión como yo a través de un proxy y acceder a los datos externos que necesito.

¿Hay algún tipo de configuración avanzada de php que pueda establecer para que internamente siempre que intente invocar algo como file_get_contents() siempre pase por un proxy? Estoy en el cajero automático de Windows así que sería un dolor recompilar si esa es la única manera. El motivo por el cual mi solución temporal es temporal es porque necesito una solución que sea genérica y funcione para múltiples usuarios en lugar de usar las credenciales de un usuario (he considerado solicitar una cuenta de usuario separada únicamente para hacerlo, pero las contraseñas cambian a menudo y esta técnica necesita ser desplegado a través de una docena o más sitios). No quiero codificar las credenciales básicamente para utilizar la solución alternativa.

Respuesta

141

Para utilizar file_get_content sobre/a través de un proxy que no requiere autenticación, algo como esto debería hacer:

(no soy capaz de probar esta: mi proxy requiere una autenticación)

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

por supuesto, la sustitución de la IP y el puerto del proxy de mi por los que están bien por la tuya ;-)


Si usted está recibiendo ese tipo de 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 

significa que su proxy requiere una autenticación.


Si el proxy requiere una autenticación, se le tiene que añadir un par de líneas, así:

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

mismo sobre IP y el puerto, y, esta vez, también de acceso y contraseña ;-)

Ahora, está pasando un encabezado Proxy-Authorization al proxy, que contiene su nombre de usuario y contraseña.

Y ... La página debe mostrarse ;-)


Espero que esto ayude! Que te diviertas !

+0

Martin, tengo un archivo proxy auto config (pac) en lugar de un solo servidor proxy. También requiere autenticación NTLM. ¿Puedes ayudarme por favor aquí? – codeomnitrix

+0

¡esto me ayuda mucho! ¡Muchas gracias! – zx1986

+0

Aparece el siguiente error: error al abrir la ruta: no se puede encontrar el transporte de socket "http": ¿se olvidó de habilitarlo cuando configuró PHP? Estoy usando PHP5.5/Apache2.4 con curl habilitado. –

1

Dependiendo de cómo funciona el inicio de sesión de proxy stream_context_set_default podría ayudarlo.

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

Aquí hay una publicación similar: http://techpad.co.uk/content.php?sid=137 que explica cómo hacerlo.

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; 

} 
17

Utilice stream_context_set_default function. Es mucho más fácil de usar ya que puede usar file_get_contents o funciones similares sin pasar ningún parámetro adicional

Este blog post explica cómo usarlo. Aquí está el código de esa página.

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

Mucho más útil que la respuesta aceptada. ¡Gracias! – Mouagip

Cuestiones relacionadas