2011-03-06 20 views
96

Estoy buscando establecer Curl para usar un servidor proxy. La URL es proporcionada por un formulario html, que no ha sido un problema. Sin el proxy, funciona bien. He encontrado código en este y otros sitios, pero no funcionan. Cualquier ayuda para encontrar la solución correcta sería muy apreciada. Siento que el bramido está cerca, pero que me falta algo. Gracias.¿Cómo usar CURL a través de un proxy?

El código abajo Adapté de aquí http://www.webmasterworld.com/forum88/10572.htm pero devuelve un mensaje de error sobre un T_VARIABLE falta en la línea 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); 
?> 

El abajo es de curl through proxy returns no content

<? 

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

es actualmente viven en Pelican -cement.com pero tampoco funciona.

ACTUALIZACIÓN: Gracias por toda su ayuda, hice los cambios anteriores. Ahora solo devuelve una pantalla en blanco.

<? 

$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; 
?> 
+2

Usted se echa en falta un punto y coma en la línea 12 –

+0

Además, es necesario cambiar $ url = '$ _POST [1]' a $ url = $ _POST [1] - de lo contrario, $ url será una cadena en lugar de la URL que desea – yoavmatchulsky

+0

Además, la clave en la matriz $ _POST es una cadena que no es un número entero, por lo que le gustaría que diga '$ _POST ['1']' – fiiv

Respuesta

182

Aquí está una versión funcional con sus errores eliminados.

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

He añadido CURLOPT_PROXYUSERPWD en caso de que cualquiera de sus servidores proxy requiere un nombre de usuario y contraseña. Establecí CURLOPT_RETURNTRANSFER en 1, por lo que los datos se devolverán a la variable $curl_scraped_page.

He eliminado un segundo extra curl_exec($ch); que detendría la variable que se devuelve. He consolidado su IP y puerto proxy en una configuración.

También eliminé CURLOPT_HTTPPROXYTUNNEL y CURLOPT_CUSTOMREQUEST ya que era el valor predeterminado.

Si no desea que se devuelvan los encabezados, comente CURLOPT_HEADER.

Para deshabilitar el proxy, simplemente configúrelo como nulo.

curl_setopt($ch, CURLOPT_PROXY, null); 

Cualquier pregunta no dude en preguntar, trabajo con cURL todos los días.

+0

es bueno saber que usted trabaja con CURL todos los días. Intenté configurar un proxy de calcetines y funciona en mi máquina local, pero no funciona en mi servidor dedicado de Linux. Alguna idea ? –

+0

@coding_idiot La mayoría de los hosts web bloquean los puertos que no son 80 o 443 por razones de seguridad. – sousdev

+0

Ya lo resolví. Estoy seguro de que otros se beneficiarán de esto. –

-1

Aquí es una función bien probado que he utilizado para mis proyectos con auto detallada comentarios explicativos


Hay muchas ocasiones en que los puertos que no sean 80 están bloqueados por el cortafuegos del servidor así que el código parece estar funcionando bien en el servidor local, pero no en el servidor

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

Esto me ayudó: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, falso); // falso para https – villamejia

Cuestiones relacionadas