php - glype - proxy web
file_get_contents detrĂ¡s de un proxy (4)
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.
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.
¿Existe 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.
La razón por la 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 solo para hacer esto pero las contraseñas cambian a menudo y esta técnica debe implementarse docena o más sitios). No quiero codificar las credenciales básicamente para utilizar la solución alternativa.
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://..../...'');
Hay una publicación similar aquí: 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;
}
Para usar file_get_content sobre / a través de un proxy que no requiera autenticación, algo como esto debería hacer:
(No puedo probar este: 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, reemplazando la IP y el puerto de mi proxy por los que están bien para los suyos ;-)
Si obtiene 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, tendrá que agregar un par de líneas, como esta:
$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;
Lo mismo sobre IP y puerto, y, esta vez, también LOGIN y PASSWORD ;-)
Ahora, está pasando un encabezado Proxy-Authorization al proxy, que contiene su nombre de usuario y contraseña.
Y ... La página debería mostrarse ;-)
Utilice la función stream_context_set_default
. Es mucho más fácil de usar ya que puedes usar file_get_contents o funciones similares sin pasar ningún parámetro adicional.
Esta publicación de blog explica cómo usarla. 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);
?>