web-dev-qa-db-fra.com

Comment avoir PHP utiliser les paramètres de proxy pour se connecter à Internet?

Je suis derrière un serveur proxy qui ne permet pas une connexion directe à Internet. Toutes mes = PHP applications ne parviennent pas à se connecter à Internet pour leurs vérifications de mise à jour, etc.

Comment puis-je savoir PHP mes paramètres de proxy?

Je ne veux pas entrer de paramètres de proxy dans le code, je veux PHP lui-même l'utiliser via un paramètre de configuration global ou quelque chose de similaire.

23
Alexar

si vous avez presque tous besoin d'un proxy pour accéder à Internet, je préférerais procéder de la sorte.

//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']]);

le proxy fonctionnera pour file_get_contents mais pas curl_exec

voici un document officiel.

13
Ian Hu

Cela dépend de la manière dont votre application PHP se connecte à Internet. 

Si vous prenez la situation la plus probable, utilisez PHP cUrl. Dans ce cas, les options suivantes vous aideront: 

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

Voir aussi: http://www.php.net/manual/en/function.curl-setopt.php

7
Tramov

Exemple de code:

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");
6
Evan Lee

J'utilise le module PEAR HTTP_Request2 .

Voici une version simplifiée de ma fonction UrlOpen ():

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();
1
Martin Tournoij

Oui c'est possible!

Vous pouvez configurer stream_context_set_default dans un fichier et l'inclure dans tout votre programme Php en utilisant la propriété auto_prepend_file php.ini.

J'ai écrit un petit Gist à propos de:

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

Et un article en français:

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

Cette technique est "cool" car elle permet à votre administrateur système de configurer l'hôte, de sorte que les développeurs n'ont rien à changer dans le code.

1
Thomas Decaux

Pour certains scripts, il vous suffit de définir la variable d'environnement HTTP_PROXY. C'était le cas pour les scripts de maintenance/composer.phar de update.php et de media-wiki.

Par exemple.:

setenv HTTP_PROXY http://1.2.3.4:3934

Si votre proxy est à 1.2.3.4, vous écoutez sur le port 3934. Cela a fonctionné pour moi.

0
rustycar

J'ai cherché sur Internet et je n'ai rien trouvé à propos de stream_context_set_default () avec unmot de passe protégéserveur proxy.

Ensuite, j'ai pensé que le mot de passe dans l'autorisation de base est envoyé dans les en-têtes . J'ai donc modifié les en-têtes avec le mot de passe extrait d'une requête CURL et cela a fonctionné parfaitement !!!

Voici comment vous le faites:

Envoyez d'abord cette demande à n'importe quel domaine (example.com) comme ci-dessous:

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

Voir les en-têtes envoyés par curl et ces lignes de proxy à utiliser plus tard:

>   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

OK maintenant il est temps de construire notre en-tête personnalisé:

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

Et cela fonctionne parfaitement, vous obtenez l'adresse IP de votre serveur proxy en réponse!

0
Tarik

Pour Drupal, vous pouvez définir la configuration du proxy dans votre fichier settings.php.

$conf['proxy_server'] et ainsi de suite.

Plus de détails ici

0
Jokerius