2010-10-08 21 views
19

Estoy detrás de un servidor proxy que no permite una conexión directa a internet. Todas mis aplicaciones PHP no se conectan a Internet para sus comprobaciones de actualización, etc.¿Cómo tener PHP para usar Proxy Setting para conectarse a internet?

¿Cómo puedo decirle a PHP mi configuración de Proxy?

No quiero ingresar la configuración de proxy en el código, quiero que PHP lo use a través de una configuración de configuración global o algo similar.

Respuesta

7

Esto depende de cómo se conecta su aplicación PHP a Internet.

Si toma la situación más probable usando PHP cUrl. En ese caso las siguientes opciones le ayudarán a:

curl_setopt($handle, CURLOPT_PROXY, $proxy_url); 
curl_setopt($handle, CURLOPT_PROXYUSERPWD, "[username]:[password]"); 

Consulte también: http://www.php.net/manual/en/function.curl-setopt.php

+0

gracias por la respuesta. pero considere que esto se puede aplicar solo para mis propios códigos. ¿Qué pasa con otras aplicaciones PHP como Drupal? Necesito que PHP se conecte a través de Proxy no a través del código. – Alexar

1

uso el módulo PEAR HTTP_Request2.

Aquí es una versión simplificada de la función mi urlopen(): Código

function UrlOpen($url) 
{ 
    $request = new HTTP_Request2($url); 

    $request->setConfig(array(
    'proxy_host' => '192.168.1.6', 
    'proxy_port' => 8080, 
    'proxy_user' => 'MYUSER', 
    'proxy_password' => 'MYPASS', 
    'ssl_verify_peer' => False, 
    'connect_timeout' => 3, 
); 

    return $request; 
} 

$req = UrlOpen($url); 
$res = $req->send(); 
if ($res->getStatus() == '200') 
    $data = $request->getBody(); 
4

muestra:

function getUrl($url) 
{ 
    $ch = curl_init(); 
    $timeout = 5; // set to zero for no timeout 
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    curl_setopt ($ch, CURLOPT_URL, $url); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_PROXY, "http://proxy.example.com"); //your proxy url 
    curl_setopt($ch, CURLOPT_PROXYPORT, "8080"); // your proxy port number 
    curl_setopt($ch, CURLOPT_PROXYUSERPWD, "username:pass"); //username:pass 
    $file_contents = curl_exec($ch); 
    curl_close($ch); 
    return $file_contents; 
} 

echo getUrl("http://www.google.com"); 
0

para Drupal puede establecer la configuración del proxy en el archivo settings.php.

$conf['proxy_server'] y así sucesivamente.

Más detalles here

11

si casi todos ustedes acceso a Internet necesita un proxy, preferiría hacer así.

//add this as the first line of the entry file may it is the index.php or config.php 
stream_context_set_default(['http'=>['proxy'=>'proxy-host:proxy-port']]); 

el proxy funciona para ambos file_get_contents y curl_exec

here is a official document.

+1

Esto funcionó muy bien para mí. –

+1

No funciona para CURL –

+1

lo siento por mi error, la API api no afecta al rizo, si usa curl, es mejor que lo configure por 'curl_setopt ($ handle, CURLOPT_PROXY, $ proxy_url);', y si usted usa ambos, puede agregar ambos dos. –

0

Para algunos scripts, todo lo que tiene que hacer es establecer la variable de entorno HTTP_PROXY. Ese fue el caso tanto para composer.phar como para el mantenimiento de media-wiki/update.php scripts.

ej .:

setenv HTTP_PROXY http://1.2.3.4:3934 

Si el proxy está en 1.2.3.4 escucha en el puerto 3934. trabajado para mí.

0

¡Sí, es posible!

Puede configurar stream_context_set_default en un archivo e incluir este archivo en todo su programa Php, utilizando la propiedad auto_prepend_file php.ini.

escribí un pequeño sobre lo esencial:

https://gist.github.com/ebuildy/381f116e9cd18216a69188ce0230708d

y un artículo en francés:

https://medium.com/@thomasdecaux/param%C3%A9trer-par-d%C3%A9faut-un-proxy-pour-php-file-get-content-3e9a32416979#.6zbg605cx

Esta técnica es "fría", ya que, esto permite que su sys-admin configure el host, para que el desarrollador no tenga que cambiar nada en el código.

0

busqué en internet y no podía encontrar nada sobre stream_context_set_default() con una contraseña protegida servidor proxy.

Luego pensé que la contraseña en la autorización básica se envía en encabezados. ¡Así que modifiqué los encabezados con la contraseña extraída de una solicitud CURL y funcionó perfectamente!

Así es como se hace:

Primera enviar esta solicitud a cualquier dominio (example.com) de la siguiente manera:

curl -v -U user:pass -x your_proxy_ip:port --url https://example.com 

Ver el rizo enviado cabeceras y tengo estas líneas de proxy para su uso posterior:

> Trying XXX.XXX.XXX.XXX... 
> Connected to XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX) port YYYY (#0) 
> Establish HTTP proxy tunnel to example.com:443 
> Proxy auth using Basic with user 'your_username_here' 
> CONNECT example.com:443 HTTP/1.1 
> Host: example.com:443 
> Proxy-Authorization: Basic YW1hem9uOnXXXXXXXXXXXXXXX25SMg 
> User-Agent: curl/7.47.0 
> Proxy-Connection: Keep-Alive 
> 
< HTTP/1.1 200 Connection established 
< 
< Proxy replied OK to CONNECT request 

bien ahora es el momento de construir nuestra cabecera personalizada:

$default_opts = array(
    'http'=>array(
    'method'=>"GET", 
    'header'=>"Proxy-Authorization: Basic YW1hem9uOnXXXXXXXXXXXXXXX25SMg\r\n" . 
       "Proxy-Connection: Keep-Alive", 
    'proxy'=>"XXX.XXX.XXX.XXX:YYYY" 
) 
); 

$default = stream_context_set_default($default_opts); 


$result = file_get_contents("https://ipleak.net/json/"); 
print_r(json_decode($result)); 

Y funciona perfecto, ¡se obtiene la IP de su servidor proxy en respuesta!

Cuestiones relacionadas