147 votes

Comment utiliser CURL via un proxy ?

Je cherche à configurer curl pour utiliser un serveur proxy. L'url est fournie par un formulaire html, ce qui n'a pas posé de problème. Sans le proxy, cela fonctionne bien. J'ai trouvé des codes sur ce site et d'autres, mais ils ne fonctionnent pas. Toute aide pour trouver la bonne solution serait très appréciée. Je pense que les solutions ci-dessous sont proches, mais qu'il me manque quelque chose. Merci.

Le code ci-dessous a été adapté d'ici http://www.webmasterworld.com/forum88/10572.htm mais il renvoie un message d'erreur à propos d'un T_VARIABLE manquant à la ligne 12.

<?

$url = '$_POST[1]';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($ch, CURLOPT_PROXY, '66.96.200.39:80');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt ($ch, CURLOPT_HEADER, 1)
curl_exec ($ch); 
$curl_info = curl_getinfo($ch);
curl_close($ch);
echo '<br />';
print_r($curl_info);
?>

Le texte ci-dessous est tiré de curl à travers un proxy ne renvoie aucun contenu

<?

$proxy = "66.96.200.39:80";
$proxy = explode(':', $proxy);
$url = "$_POST[1]";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy[0]);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy[1]);
curl_setopt($ch, CURLOPT_HEADER, 1);

$exec = curl_exec($ch);

echo curl_error($ch);
print_r(curl_getinfo($ch));
echo $exec;
?>

est actuellement en ligne sur pelican-cement.com mais ne fonctionne pas non plus.

UPDATE : Merci pour toute votre aide, j'ai fait les changements ci-dessus. Maintenant, il ne renvoie qu'un écran vide.

<?

$url = $_POST['1'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($ch, CURLOPT_PROXY, '66.96.200.39:80');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_exec ($ch); 
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;
?>

3 votes

Il manque un point-virgule à la ligne 12.

0 votes

Vous devez également remplacer $url = '$_POST[1]' par $url = $_POST[1] - sinon, $url sera une chaîne de caractères au lieu de l'URL souhaitée.

0 votes

De plus, la clé dans le tableau $_POST est une chaîne de caractères et non un entier, donc vous voudriez qu'elle dise $_POST['1']

248voto

GravyCode Points 761

Voici une version fonctionnelle avec vos bugs supprimés.

$url = 'http://dynupdate.no-ip.com/ip.php';
$proxy = '127.0.0.1:8888';
//$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
//curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;

J'ai ajouté CURLOPT_PROXYUSERPWD au cas où l'un de vos proxys nécessiterait un nom d'utilisateur et un mot de passe. Je règle CURLOPT_RETURNTRANSFER à 1, de sorte que les données seront retournées à $curl_scraped_page variable.

J'ai enlevé un deuxième supplément curl_exec($ch); ce qui empêcherait la variable d'être renvoyée. J'ai consolidé l'IP et le port de votre proxy en un seul paramètre.

J'ai aussi enlevé CURLOPT_HTTPPROXYTUNNEL y CURLOPT_CUSTOMREQUEST car c'était la valeur par défaut.

Si vous ne voulez pas que les en-têtes soient retournés, commentez CURLOPT_HEADER .

Pour désactiver le proxy, il suffit de lui attribuer la valeur null.

curl_setopt($ch, CURLOPT_PROXY, null);

Si vous avez des questions, n'hésitez pas à me les poser. cURL tous les jours.

0 votes

C'est agréable de savoir que vous travaillez avec CURL tous les jours. J'ai essayé de configurer un proxy socks et cela fonctionne sur ma machine locale mais pas sur mon serveur dédié linux. Une idée ?

0 votes

La plupart des hébergeurs bloquent les ports qui ne sont pas 80 ou 443 pour des raisons de sécurité.

0 votes

Mais j'ai déjà résolu le problème. Je suis sûr que d'autres en profiteront.

43voto

Somnath Muluk Points 10173

J'ai expliqué l'utilisation des diverses options CURL requises pour CURL PROXY.

$url = 'http://dynupdate.no-ip.com/ip.php';
$proxy = '127.0.0.1:8888';
$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);         // URL for CURL call
curl_setopt($ch, CURLOPT_PROXY, $proxy);     // PROXY details with port
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);   // Use if proxy have username and password
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); // If expected to call with specific PROXY type
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  // If url has redirects then go to the final redirected URL.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);  // Do not outputting it out directly on screen.
curl_setopt($ch, CURLOPT_HEADER, 1);   // If you want Header information of response else make 0
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;

0voto

Namasivayam Points 39
root@APPLICATIOSERVER:/var/www/html# php connectiontest.php
61e23468-949e-4103-8e08-9db09249e8s1 OpenSSL SSL\_connect: SSL\_ERROR\_SYSCALL in connection to 10.172.123.1:80 root@APPLICATIOSERVER:/var/www/html#

Le problème de la déclaration des paramètres du proxy dans le fichier php script a été corrigé.

$proxy = '10.172.123.1:80';
curl\_setopt($cSession, CURLOPT\_PROXY, $proxy); // PROXY details with port

-2voto

hammad1238 Points 1

Voici une fonction bien testée que j'ai utilisée pour mes projets avec des commentaires explicatifs détaillés


Il arrive souvent que les ports autres que 80 soient bloqués par le pare-feu du serveur. Le code semble donc fonctionner correctement sur l'hôte local mais pas sur le serveur.

function get_page($url){

global $proxy;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_HEADER, 0); // return headers 0 no 1 yes
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return page 1:yes
curl_setopt($ch, CURLOPT_TIMEOUT, 200); // http request timeout 20 seconds
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Follow redirects, need this if the url changes
curl_setopt($ch, CURLOPT_MAXREDIRS, 2); //if http server gives redirection responce
curl_setopt($ch, CURLOPT_USERAGENT,
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); // cookies storage / here the changes have been made
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // false for https
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); // the page encoding

$data = curl_exec($ch); // execute the http request
curl_close($ch); // close the connection
return $data;
}

1 votes

Ceci m'a aidé : curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false) ; // false pour https

2 votes

@villamejia Attention, cependant, à l'utilisation de CURLOPT_SSL_VERIFYPEER = false. Cela signifie que cURL n'effectuera aucune vérification de certificat lors de la connexion au serveur https, rendant ainsi la connexion vulnérable à une éventuelle attaque man-in-the-middle - la sécurité des données n'est donc plus garantie. Il vaut mieux utiliser CURLOPT_CAPATH pour donner un répertoire contenant un ensemble d'autorités de certification racine valides ( /etc/ssl/certs sur Debian/Ubuntu, par exemple)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X