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.
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
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
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");
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();
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:
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.
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.
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!
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